Вот что я бы сделал:
Начните с основ:
class Car {};
, а затем расширьте его по мере необходимости.
Дело в том, что никаких дополнительных требований пока нет.
Не существует требования, чтобы автомобиль использовал различные компоненты для чего-либо, поэтому я оставлю их пока. Мы просто должны быть в состоянии создать автомобиль с определенными компонентами. Но пока мы не знаем, что эти компоненты должны делать , нет никаких причин делать из них что-то большее, чем комментарий:
// create a car using engine A and gearbox B
Car car1;
// create one with engine C and electrical D
Car car2;
И вот мы здесь. Это мой дизайн. Учитывая эту отправную точку, для расширения системы требуется совсем немного кода, когда вы предъявляете больше требований. Практически ничего не может сломаться или потребовать переписывания при изменении требований. Это просто и чисто.
Итак, на данный момент я пришел к выводу, что это идеальный дизайн, соответствующий вашим требованиям. Он гораздо надежнее, гораздо эффективнее и с меньшей вероятностью содержит ошибки, чем ваша большая иерархия наследования. И это также стопроцентный код многократного использования.
Как вы, вероятно, поняли из моих комментариев по вашему вопросу, хороший дизайн зависит от контекста. Не существует хорошего дизайна для "автомобилей" в аннотации.
Но мы можем предложить хороший дизайн для «автомобилей для гоночной игры», или «системы управления автомобильным заводом», или для «отображения состояния различных свойств автомобиля (двери открыты или закрыты, текущие) скорость, уровень топлива, отстегнуты ремни безопасности). "
Дизайн не зависит от того, какие объекты вы моделируете, а от того, что вы хотите с ними сделать . И из вашего описания до сих пор, цель объектов не что иное, как быть там. Поэтому я предлагаю модель, где машины есть и ничего больше.
Лучший дизайн - это не тот, который лучше всего описывает некоторый физический объект, а тот, который лучше всего позволяет вашему приложению делать то, что он должен делать.
И если все ваше приложение должно делать «иметь машину», то модель становится довольно простой.