В C# в двух иерархиях классов, как я могу ссылаться один из другого?
Прошу прощения за неопределенный характер вопроса. Я не мог придумать краткого способа объяснить проблему, с которой я, кажется, сталкиваюсь в энный раз и которая, как мне кажется, должна быть чрезвычайно распространенным сценарием. Код объясняет это лучше всего...
abstract class LogicBase {} class LogicSubclassA : LogicBase{} class LogicSubclassB : LogicBase{} abstract class GraphicsBase { public GraphicsBase( LogicBase logicObject ) => LogicObject = logicObject; public LogicBase LogicObject { get; private set; } } class GraphicsSubclassA : GraphicsBase { public GraphicsSubclassA( LogicBase logicObject ) : base( logicObject ) {} } class GraphicsSubclassB : GraphicsBase { public GraphicsSubclassB( LogicBase logicObject ) : base( logicObject ) {} }
Пока все в порядке. Теперь проблема заключается в том, что в конкретном графическом объекте (например,
GraphicsSubclassB
) код иногда должен ссылаться на свой конкретный связанный логический объект (LogicSubclassB
Поскольку я знаю, каким должен быть тип логического объекта, я могу использовать простое приведение или as
оператор. Так что я мог бы просто взять это:class GraphicsSubclassB : GraphicsBase { public GraphicsSubclassB( LogicBase logicObject ) : base( logicObject ) {}; public LogicSubclassB StronglyTypedLogicObject => (LogicSubclassB)LogicBase; }
Но есть ли способ выразить это в
GraphicsBase
? Есть ли способ выразить, что каждый подкласс GraphicsBase
необходимо обеспечить собственную реализацию StronglyTypedLogicObject
собственность?Что я уже пробовал:
Единственный способ, которым я могу думать, что это может сработать, - это использовать дженерики, что-то вроде следующего (что не компилируется)...
abstract class GraphicsBase<T> where T : LogicBase { public GraphicsBase( LogicBase logicObject ) => LogicObject = logicObject; public LogicBase LogicObject { get; private set; } public virtual T StronglyTypedLogicObject => LogicObject; } class GraphicsSubclassB<T> : GraphicsBase<LogicSubclassB> { public GraphicsSubclassB( LogicBase logicObject ) : base( logicObject ) {} public override T StronglyTypedLogicObject => (T)LogicObject; }