Извините, если об этом уже спрашивали. Я не нашел внятного ответа.
У меня есть два класса, мотоцикл и автомобиль. Разница только в количестве колес и разрешенном количестве пассажиров.
В этом случае, буду ли я использовать мотоцикл в качестве базового класса (и пусть автомобиль будет подклассом) или создам новый базовый класс «транспортное средство»?
Я уверен, что вы можете придумать больше различий между мотоциклом и автомобилем, чем количество колес и допустимое количество пассажиров. Можете ли вы сделать wheelie()
на машине или buckleSeatBelt()
на мотоцикле. Класс имеет методы, а также состояние.
Как правило, наследование используется для моделирования отношения «isA».
Автомобиль состоит из деталей, аналогичных двум мотоциклам, но автомобиль — это нет мотоцикл.
Однако и автомобили, и мотоциклы являются транспортными средствами.
Итак, если бы это был я, я бы использовал класс транспортных средств в качестве базового класса и производил бы от него и автомобиль, и мотоцикл.
Это действительно будет основано на том, как вы определяете мотоцикл и автомобиль. Если все, о чем вы заботитесь, это «у него есть двигатель и он может перевозить людей». Тогда автомобиль может быть производным классом от мотоцикла.
Но для меня это довольно глупая концепция — автомобиль и мотоцикл — это две разные вещи, которые имеют некоторые схожие свойства, например, тип двигателя. Но у мотоцикла не будет понятия «количество дверей», это только для автомобилей.
Когда две вещи имеют схожие свойства, но принципиально разные, вам следует выбрать базовый класс (или интерфейсы), от которого они обе наследуются.
Вероятно, нигде нет вопроса здорово, но лучшим местом для такого рода вопросов будет softwareengineering.stackexchange.com.