これは短くしたいと思います。と という 2 つの部屋を持つ 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
) を建設するとします。これは上記とまったく同じですが、1 つの変更点があります。BedRoom
2 つの別々の部屋 (つまりと)は必要ありません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() = ??
. これは継承の適切な使用ですか?
私の実際の設計は、2 つの個々のチップの機能を組み合わせた複雑なチップです (私は House (マザーボード) と Room (チップ) の類推を使用しました)。私はオブジェクト指向 Perl でコードを書いていますが、別の設計案があれば本当にありがたいです。
ありがとう