15

これは短くしたいと思います。と という 2 つの部屋を持つ HouseA を構築しますBedRoomStudyRoomこれらは両方とも という基本クラスから派生していRoomます。 BedRoomStudyRoom呼ばれる同じ親がありHouseます。また、家のどの部屋も、親を介してのみ他の部屋にアクセスできます。BedRoomのいずれかの属性にアクセスする必要がある場合は、(親) をStudyRoom介してのみアクセスする必要があり、Houseその逆も同様です。

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

ここでの問題: たとえば、別の家 (たとえばHouseB) を建設するとします。これは上記とまったく同じですが、1 つの変更点があります。BedRoom2 つの別々の部屋 (つまりと)は必要ありませんStudyRoomが、代わりに、MasterRoomこれらの両方の設備を備えた単一の部屋 ( ) が必要です。コードの再利用性のために、次の設計オプションを考えることができます。

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

ここで、 用に作成したBedRoomとの属性を再利用できなくなります。とにかく、とのほとんどの属性を再実装する必要があるため、コードが重複することに注意してください。StudyRoomHouseABedRoomStudyRoomMasterRoom

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() = 4logicalBedRoom->noOfSides() = ??. これは継承の適切な使用ですか?

私の実際の設計は、2 つの個々のチップの機能を組み合わせた複雑なチップです (私は House (マザーボード) と Room (チップ) の類推を使用しました)。私はオブジェクト指向 Perl でコードを書いていますが、別の設計案があれば本当にありがたいです。

ありがとう

4

1 に答える 1

19

これを実現するためにロールを使用しない理由:

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

ロールを取得する最も簡単な方法は、 Mooseを使用することです。

于 2009-10-21T06:25:20.487 に答える