Как я могу заставить свой класс принимать между двумя разными свойствами?

У меня есть следующий класс:

public class MonthlyQuota
{
    public virtual EmployeeVacationForm Form { get; set; }
    public virtual DateTime? DateEmployeeSubmitted => Form?.DateCreated;
    
    public MonthlyQuota(QuarterlylSupport document)
    : this()
    {
        Document = document;
    }

    internal MonthlyQuota(
        QuarterlylSupport document, 
        EmployeeVacationForm form)
            : this(document)
    {
        Form = form;
        form.QuotaResult = this;
    }
    
    

Он используется следующим образом:

var staffResults = vacations.Select(vf => new MonthlyQuota(vf));    //where `vf` is the vacation form

Прямо сейчас нужно только EmployeeVacationForm, но мне нужно добавить еще одну форму под названием EmployeeVacationForm_Remote и вызвать ее так:

var staffResults = vacations.Select(rvf => new MonthlyQuota(rvf));    //where `rvf` is the remote vacation form

Итак, как в моем классе MonthlyQuota объект Form может быть либо EmployeeVacationForm, либо EmployeeVacationForm_Remote?

Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы свойство Form в вашем классе MonthlyQuota принимало либо EmployeeVacationForm, либо EmployeeVacationForm_Remote, вы можете определить базовый класс или интерфейс, который оба EmployeeVacationForm и EmployeeVacationForm_Remote наследуют или реализуют. Затем вы можете использовать этот общий базовый класс или интерфейс в качестве типа свойства Form.

Предполагая, что у вас есть базовый класс BaseEmployeeVacationForm, вы можете изменить свой MonthlyQuota класс следующим образом:

    public class MonthlyQuota
{
    public virtual BaseEmployeeVacationForm Form { get; set; }
    public virtual DateTime? DateEmployeeSubmitted => Form?.DateCreated;
    
    public MonthlyQuota(QuarterlySupport document)
    {
        Document = document;
    }

    public MonthlyQuota(QuarterlySupport document, BaseEmployeeVacationForm form)
        : this(document)
    {
        Form = form;
        form.QuotaResult = this;
    }
}

В этом случае и EmployeeVacationForm, и EmployeeVacationForm_Remote должны наследовать от BaseEmployeeVacationForm. Таким образом, вы можете передать любой объект, который является подклассом BaseEmployeeVacationForm, в свойство Form MonthlyQuota.

Затем, когда вы создаете объект MonthlyQuota, вы можете передать либо EmployeeVacationForm, либо EmployeeVacationForm_Remote:

var StaffResults = Vacations.Select(vf => new MonthlyQuota(document, vf)); вар RemoteStaffResults = RemoteVacations.Select(rvf => new MonthlyQuota(document, rvf));

Не забудьте настроить классы EmployeeVacationForm и EmployeeVacationForm_Remote для наследования от BaseEmployeeVacationForm.

Есть ли способ сделать это, если нет базового класса? Спасибо!

SkyeBoniwell 16.04.2024 15:31

Если вы хотите, чтобы объект Form в вашем классе MonthlyQuota был либо EmployeeVacationForm, либо EmployeeVacationForm_Remote без общего базового класса, вы можете добиться этого, используя общий интерфейс, который реализуют оба класса.

Вот как вы можете изменить свой класс MonthlyQuota: публичный класс MonthlyQuota

{
    public virtual IEmployeeVacationForm Form { get; set; }
    public virtual DateTime? DateEmployeeSubmitted => Form?.DateCreated;
    
    public MonthlyQuota(QuarterlylSupport document, IEmployeeVacationForm form)
    {
        Document = document;
        Form = form;
        form.QuotaResult = this;
    }
}

Затем вы можете определить интерфейс IEmployeeVacationForm, который будут реализовывать как EmployeeVacationForm, так и EmployeeVacationForm_Remote:

public interface IEmployeeVacationForm

    {
        DateTime DateCreated { get; set; }
        MonthlyQuota QuotaResult { get; set; }
        // Any other properties or methods needed
    }

Просто убедитесь, что оба EmployeeVacationForm и EmployeeVacationForm_Remote реализуют интерфейс с необходимыми свойствами (DateCreated, QuotaResult и т. д.).

Другие вопросы по теме