Я ищу лучший способ моделирования сценария в C #, который я бы назвал "перекрестным наследованием".
Во-первых, у меня есть ориентированный граф, узлы которого могут быть двух разных типов: Разъем и Компонент .Я создаю интерфейс IObjectBase , который содержит свойства, которые есть и у Connector, и у Component, например список IObjectBase-Children.Затем я создаю интерфейсы для Соединителей и Компонентов, которые унаследованы от IObjectBase:
public interface IObjectConnector : IObjectBase ...
public interface IObjectComponent : IObjectBase ...
Реализация выглядит аналогично, я создаю абстрактный класс для BaseObject и наследую его для классов Соединителя и Компонента:
public abstract class ObjectBase : IObjectBase ...
public class ObjectConnector : ObjectBase, IObjectConnector ...
public class ObjectComponent : ObjectBase, IObjectComponent ...
Пока все хорошо.Проблема заключается в том, что ориентированный граф может существовать в двух разных «состояниях» или «режимах» - в режиме редактирования и в режиме конфигурации .В зависимости от режима, есть свойства и методы, которые имеют соединители и компоненты (например, добавление дочерних элементов только в режиме редактора или свойство isSelected только в режиме конфигуратора).
Итак, мне нужноиметь 4 разных объекта: ComponentConfig , ComponentEdit , ConnectorConfig , ConnectorEdit
Я начал с размышлений о дальнейшем наследованииIObjectConnector и IObjectComponent:
public interface IObjectConnectorEditor : IObjectConnector
public interface IObjectConnectorConfigurator : IObjectConnector
...
и создание объектов при наследовании от существующих компонентов и соединителей:
public class ObjectConnectorEditor : ObjectConnector, IEditor
...
public class ObjectComponentEditor: ObjectComponent, IEditor
Проблема теперь заключается в следующем: мне нужно реализовать интерфейс IEditor в обоихКлассы редактора, которые были бы очень избыточными.Но я не могу создать реализацию IEditor, от которой объекты будут наследовать, потому что я могу наследовать только от одного класса в C #, поэтому следующее не будет работать:
public abstract class Editor : IEditor ...
public class ObjectConnectorEditor: ObjectConnector, Editor
Что бы вы предложили как лучшийархитектурное решение этой проблемы?
Заранее спасибо,
Фрэнк