У меня есть следующий шаблон реального мира, где базовый класс BCA
содержит общедоступное свойство B
базового класса типа BCB
. Оба BCA
и BCB
имеют два производных класса каждый - DCA1
и DCA2
, DCB1
и DCB2
соответственно. В каждом из DCA1
и DCA2
собственность в реальном мире фактически относится к типу DCB1
и DCB2
соответственно.Базовый класс A содержит свойство базового класса B, но производный класс A1 имеет производный класс B1
Как это наиболее эффективно транслируется в код - дизайн ООП? Должен ли я держать B
в BCA
, или я должен использовать его в каждом из DCA1
и DCA2
? Должен ли я использовать дженерики? Что-то не так с этим дизайном? Бывает, что я уже пару раз встречался в этом проекте, и почему-то это не кажется правильным; но мне интересно, ошибочна ли моя концепция.
EDIT: Я даю более конкретный пример, чтобы сделать его более ясным. Извините, но мне не разрешено размещать изображения, чтобы показать их на диаграмме классов, но так оно и есть:
A Pet имеет свойство DailyMeal типа PetFood. Свойство Cat's DailyMeal имеет тип CatFood, а Dog's DailyMeal имеет тип DogFood.
Я надеюсь, что это сделает рисунок более четким.
EDIT2: вопрос повторно выражен как: Как вы модель такого реального сценария в котором у вас есть автомобиль с двигателем, ElectricCar с ElectricEngine и DieselCar с DieselEngine и т.д., в термины ООП и, в частности, в C#, так что вы можете использовать полиморфизм:
Car myCar = myElectricCar;
myCar.Engine = myElectricEngine;
и т.д., и в то же время гарантируя, что каждый тип автомобиля будет иметь правильный тип двигателя. Цель состоит в том, чтобы смоделировать этот реальный сценарий с точки зрения классов, интерфейсов и/или дженериков или любого другого, что требуется, и воспользоваться всеми преимуществами ООП.
Если эти свойства доступны для записи, это нарушает принцип замещения Лискова. В любом случае, нет хорошего решения с классами, но вы можете использовать ковариантные интерфейсы. –
Все ваши акронимы действительно запутывают. Есть ли вероятность, что вы можете показать пример кода с более простыми именами? – StriplingWarrior
@StriplingWarrior Автомобиль имеет двигатель. ElectricCar имеет ElectricEngine. –