Универсальный конструктор со сравнением типов

1

Я хочу знать, возможно ли что-то подобное в С#.

Предположим, у меня также есть класс "Родитель" и два класса, которые наследуются от класса "Родитель", называемого "Child1" и "Child2".

///<summary>
/// Constructor for my form.
///</summary>
public FrmMainForm<T>(T thisChild)
{
    if(thisChild.GetType() == typeof(Child1)
    {
        // Do something
    }
    else if(thisChild.GetType() == typeof(Child2)
    {
        // Do something else
    }
}

С помощью конструктора код для вызова может выглядеть так:

FrmMainForm thisForm = FrmMainForm<Child1>(childObjectToPassIn);

Я хочу создать конструктор с использованием обобщенного и сравнить тип родового. Это возможно?

Теги:
winforms

3 ответа

2
Лучший ответ

Если оба дочерних класса наследуются от Parent и вы все равно используете проверку типов, просто введите параметр типа Parent:

///<summary>
/// Constructor for my form.
///</summary>
public FrmMainForm(Parent thisChild)
{
    if(thisChild.GetType() == typeof(Child1)
    {
        // Do something
    }
    else if(thisChild.GetType() == typeof(Child2)
    {
        // Do something else
    }
}

или просто добавить перегрузки (возможно, рефакторинг любой "общей" койды в отдельные методы:

///<summary>
/// Constructor for my form.
///</summary>
public FrmMainForm(Child1 thisChild)
{
    // Do something
}

public FrmMainForm(Child2 thisChild)
{
    // Do something else
}
  • 0
    Это то, что у меня изначально было, я не был уверен, что вы можете передать объект типа 'child' в метод с переменной типа 'Parent'. Ты можешь сделать это?
  • 0
    @OhaxNuv Да, ты можешь. Однако это не очень хороший дизайн - лучше иметь virtual методы / свойства в родительском классе и override их в дочерних классах. Тогда вы не привязаны к определенным классам (кроме родительских).
1

У вас не может быть конструктора, который делает это, но у вас может быть общий заводский метод, который делает это:

public FrmMainForm Create<T>(T thisChild) where T : Parent
{
    FrmMainForm result = new FrmMainForm();

    if(thisChild.GetType() == typeof(Child1)
    {
        // Do something
    }
    else if(thisChild.GetType() == typeof(Child2)
    {
        // Do something else
    }

    // return your form
}

Если вы сделаете конструктор private, это станет единственным способом создания вашей формы.

При этом включение типов почти всегда является признаком плохого дизайна. Я бы посоветовал вам пересмотреть, почему вы хотите различное поведение на основе двух дочерних типов, и может ли он быть реорганизован в один метод, называемый непосредственно в классе Parent.

  • 0
    Спасибо за вклад. Просто ради любопытства, почему это считается плохим дизайном?
  • 0
    @OhaxNuv Включение типа является хрупким, и это обычно означает, что ваша логика «вверх ногами» - если вы создаете из базового класса, не должно иметь значения, какой это «подкласс», поведение должно быть таким же.
0

Вы не должны использовать отражение, чтобы проверить тип выполнения объекта здесь. Вместо этого вы должны использовать полиморфизм, чтобы позволить вам относиться ко всем объектам одинаково, и каждый из них индивидуально работает отдельно, основываясь на своих собственных определениях.

Родительский тип должен определять набор методов/свойств, которые представляют операции, которые вы хотите выполнять на любом из этих типов объектов, каждый дочерний объект может затем реализовать методы/свойства, как им нужно, чтобы они надлежащим образом функционировали для их конкретные различия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню