В большинстве примеров из учебников (GoF, Refactoring.Guru и т. д.) иерархия классов выглядит так:
Компонент
├── Leaf
└── Composite
Однако в моем реальном приложении компонентам также нужен общий Id, потому что они должны быть сохранены (база данных XML) и использовать его как Generic в различных классах менеджеров.
Поэтому вместо того, чтобы сделать Component корневым классом, я использую это:
Код: Выделить всё
public abstract class EntityBase
{
public int Id { get; set; }
}
public abstract class Component : EntityBase
{
public string Name { get; set; }
public virtual bool IsLeaf => true;
public virtual IReadOnlyList Children => Array.Empty();
}
public class Permission : Component // Leaf
{
}
public class Role : Component // Composite
{
private List _children = new();
public override bool IsLeaf => false;
}
«Компонент не должен наследовать ни от чего другого».
«Компонент должен быть самым верхним корнем иерархии».
Я не могу найти подтверждения этому в исходной книге GoF.
Требует ли шаблон Composite, чтобы компонент был корнем наследования? иерархии?
Или допустимо ли для компонента наследовать от другого абстрактного базового класса (например, EntityBase, который предоставляет только идентификатор) без нарушения принципов композитного проектирования?
Я ищу:
- цитаты из ссылок на шаблоны проектирования (GoF, Fowler, Gamma и т. д.).
- примеры реальных реализаций.
- разъяснение того, нарушает ли это шаблон или все в порядке
хорошо.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ss-without
Мобильная версия