Должен ли я использовать наследование или состав?

Я хотел бы сохранить этот короткий. Я строю HouseA, который имеет две комнаты, скажем BedRoom и StudyRoom, оба из которых основаны на базовом классе Room. BedRoom и StudyRoom имеют один и тот же родительский элемент, называемый House. Кроме того, любая комната в доме может получить доступ к любым другим комнатам только через родителя. Если BedRoom должен получить доступ к любому атрибуту StudyRoom, он должен пройти только через House (т.е. Родительский) и наоборот.

HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room

Теперь проблема: скажем, я построю еще один дом (скажем HouseB), который точно такой же, как и выше, но с одним изменением. Мне не нужны две отдельные комнаты (т.е. BedRoom и StudyRoom), но вместо этого одна комната (MasterRoom), которая имеет оба этих объекта. Для повторного использования кода я мог бы подумать о следующих вариантах дизайна:

Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room

Здесь я теряю возможность повторно использовать атрибуты BedRoom и StudyRoom, которые я создал для HouseA. Обратите внимание, что в большинстве случаев атрибуты BedRoom и StudyRoom должны быть повторно реализованы в MasterRoom, что приводит к дублированию кода.

Option-2:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
MasterRoom HAS LogicalBedroom
MasterRoom HAS LogicalStudyRoom
LogicalBedroom ISA BedRoom
LogicalStudyRoom ISA StudyRoom

Таким образом, я использую композицию, чтобы я мог повторно использовать большую часть своего кода (у меня есть несколько тысяч строк кода, которые я мог бы повторно использовать), но проблема в том, что BedRoom - это конкретный класс, а logicalBedRoom может найти некоторые атрибуты не подходят и могут быть вынуждены переопределять методы, чтобы они ничего не делали. Например, Bedroom->noOfSides() = 4 и logicalBedRoom->noOfSides() = ??. Является ли это хорошим использованием наследования?

Мой фактический дизайн предназначен для сложного чипа, который сочетает в себе функциональность двух отдельных чипов (я использовал аналогию с House (материнская плата) и Room (chip)). Я кодирую в Object Oriented Perl, и я был бы очень признателен за любые альтернативные дизайнерские предложения.

Спасибо

Ответы

Ответ 1

Почему бы не использовать роли для достижения этой цели:

House A has a Bedroom
Bedroom does SleepingArea
House has a Studyroom
Studyroom does ComfyArea

House B has a MasterRoom
MasterRoom does SleepingArea and ComfyArea

Самый простой способ получить roles - использовать Moose.