Ответ 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
Я хотел бы сохранить этот короткий. Я строю 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, и я был бы очень признателен за любые альтернативные дизайнерские предложения.
Спасибо
Почему бы не использовать роли для достижения этой цели:
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