Передача различных объектов одного и того же родительского класса в конструктор / метод, в котором размещается объект производного класса generi c - PullRequest
0 голосов
/ 11 марта 2020

У нас есть родительский класс

public class ParentClass
{
    int GeneralVariable;
}

, затем производный класс (просто класс, содержащий информацию)

public class DerivedClassOne : ParentClass
{
    int DerivedSpecificVariableOne;
}

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

public class DerivedClassTwo : ParentClass
{
    int DerivedSpecificVariableTwo;
}

Затем класс, который может "содержать" только один из этих 2 производных классов:

public class HousingClass : UnrelatedImportantClass
{
    public void DoWorkingOnDerivedClasses(){}
}

Затем класс, который содержит все. HostClass будет вызывать методы HousingClass для выполнения работы над DerivedClass

public class HostClass
{
    List<HousingClass> Housings = new List<HousingClass>();
}

В этом классе жилья я хотел бы иметь возможность "разместить" либо DerivedClassOne, либо DerivedClassTwo, а также иметь возможность "выполнять работу". «на любом из производных классов. В идеале, мне бы не хотелось иметь кучу перегруженных c -тор или методов с кучей переменных класса, определяющих разные производные классы. Прямо сейчас именно так выглядит класс «Жилье», и я предвижу, что он станет громоздким и его трудно поддерживать в ближайшем будущем.

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

1 Ответ

0 голосов
/ 11 марта 2020

Generi c класс будет частично удовлетворять вашим требованиям - ваш класс "жилья" будет по-прежнему ограничен использованием "родительских" методов, но внешние абоненты смогут использовать методы / свойства правильного производного класса.

public class HousingClass<T> where T : ParentClass
{
    public T Derived {get;set;}

    public void Method()
    {
      // can only use methods/properties from ParentClass
      Console.WriteLine(Derived.GeneralVariable);
    }
}

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

DerivedClassOne d = new DerivedClassOne();
HousingClass<DerivedClassOne> house = new HousingClass<DerivedClassOne>
     {  Derived = d };
house.Derived.DerivedSpecificVariableOne = 42; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...