Может ли класс составного компонента наследовать от другого абстрактного базового класса, не нарушая шаблон составного кC#

Место общения программистов C#
Ответить
Anonymous
 Может ли класс составного компонента наследовать от другого абстрактного базового класса, не нарушая шаблон составного к

Сообщение Anonymous »

Я изучаю и реализую шаблон проектирования Composite на C# для университетского проекта.
В большинстве примеров из учебников (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;
}
Мой профессор утверждает, что эта реализация «нарушает» шаблон Composite, потому что:
«Компонент не должен наследовать ни от чего другого».
«Компонент должен быть самым верхним корнем иерархии».
Я не могу найти подтверждения этому в исходной книге GoF.
Требует ли шаблон Composite, чтобы компонент был корнем наследования? иерархии?
Или допустимо ли для компонента наследовать от другого абстрактного базового класса (например, EntityBase, который предоставляет только идентификатор) без нарушения принципов композитного проектирования?
Я ищу:
  • цитаты из ссылок на шаблоны проектирования (GoF, Fowler, Gamma и т. д.).
  • примеры реальных реализаций.
  • разъяснение того, нарушает ли это шаблон или все в порядке
    хорошо.
Спасибо!>

Подробнее здесь: https://stackoverflow.com/questions/798 ... ss-without
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»