Я много читал о композиции и пытался понять, как я могу реорганизовать свое дерево наследования, используя композицию. В настоящее время мой класс выглядит следующим образом:
public abstract class BaseClass
{
public abstract string displayText { get; }
public abstract List<Parameter> parameters { get; }
public abstract void FireEvent();
}
public abstract class SubClass<T> : BaseClass
{
private string _displayText;
public override string displayText { get { return _displayText; } }
private List<Parameter> _parameters;
public override List<Parameter> parameters { get { return _parameters; } }
private T _value; // ADDED TO SUBCLASS
public abstract Event<T> Evt { get; } // ADDED TO SUBCLASS
public override void FireEvent()
{
Evt.Raise(_value);
}
}
public class IntClass : SubClass<int>{}
public class StringClass : SubClass<string>{} // more subclasses like this
Насколько я понимаю, здесь происходит наследование и композиция.
Подкласс Has-A : (Композиция)
- Список
Parameters
- Поле для
Event
- Поведение
Event<T>
, которое вызывается в его собственном FireEvent
методе
Подкласс Is-A : Базовый класс (Наследование)
IntClass / StringClass Is-A : Подкласс & BaseClass
Причина для создания BaseClass
, потому что мне нужны полиморфные c списки. Таким образом, я могу создать List<BaseClass>
и вызвать FireEvent()
для каждого элемента в списке и получить доступ к displayText
и List<Parameter>
в al oop.
В будущем мне понадобится подпрограмма класс, который не имеет Event
и подкласс, который будет принимать параметр в FireEvent()
. Другие варианты могут появиться.
Как бы я полностью заменил мою текущую структуру на композиционный подход? Это вообще выполнимо?