1

例として、ifHouseは基本クラスでありColonial、はのサブクラスでありHouse、Colonialには。であるメソッドがありgoUpstairsます。と呼ばれる別のクラスがありますMansion。これものサブクラスでありHouseMansionメソッドがありますuseElevator(たとえば、マンションは1〜35などの多くのフロアを持つことができます)。

物事はこのように始めるべきですか?Duplexまたは、6か月後に、のサブクラスでHouseあり、メソッドも必要とする新しいクラスが必要になった場合はどうなりgoUpstairsますか?とでgoUpstairsコードを複製した場合、それはそれほど乾燥していません(Do n't Repeat Yourself)。クラスは最初は異なるように設計する必要がありますか?それとも、6か月後にのみ異なる設計にする必要があり、どのように変更する必要がありますか?ColonialDuplex

4

3 に答える 3

2

このような継承ツリーを構築するのは良い考えではないと思います。あなたが言ったように、それは順列爆発になります

「インターフェース」を使ってみてください

Javaでは

public abstract class House {
 ...
}

public interface HasStairs {
    public boolean putUpstairs (Thing x);
    public boolean putDownstairs (Thing x);
}

public interface HasElevator {
    public boolean putUp (Thing x);
    public boolean putDown (Thing x);
    public boolean putTo (Thing x, Floor pFloor);
}

public MyHouseA extends House {}

public MyHouseB extends House implements HasStairs {}

public MyHouseC extends House implements HasElevator {}

public MyHouseD extends House implements HasStairs, HasElevator {}
于 2012-04-12T19:14:30.610 に答える
1

家が完全な(抽象ではない)クラスである場合は、そのすべてのサブクラスに共通する機能のみを備えている必要があります。複数のクラスに、すべての家に共通ではない同様の機能を持たせたい場合は、複数のサブクラスを持つことができます。

Public House ...

Public MultiLevelHouse extends House {
    public void goUpstairs() ...

Public Duplex extends MultiLevelHouse {
   ...

Public Colonial extends MutliLevelHouse {
   ...

Public Mansion extends MutliLevelHouse {
    //Override goUpstairs to use useEvalator if you want 
    ...
于 2012-04-12T19:12:06.110 に答える
0

このような場合は、セマンティクスについて少し考えてみましょう。

  • には階段があります。
  • にはエレベーターがあります。

ですから、このように考えると、自然に作曲にたどり着きます。

家自体に上がる方法を置くのではなく、家を部品の入れ物と考えてください。エレベーターがなくても大邸宅が存在する可能性があります。

したがって、ElevatorクラスとStairsクラス(または多分Escalator)を実装します。それらがいくつかのコード、またはやなどのメソッドを共有している場合は、のようなインターフェイスや基本クラスを持つことができgoUpます。goDownIVerticalTransport

この一連の思考を続けると、Floorオブジェクトもあります。IVerticalTransportは、1つ以上のを接続します。Floorこれは、に含まれますHouse

これを少し拡張して、あなたが言及したマンションとデュプレックスの概念を再び含めるには、おそらくHouseFactory。Aには、特定の設定でHouseFactoryを構成する方法があります。House

  • HouseFactory.getMansion()House4Floor秒と数Stair秒でaを返します
  • HouseFactory.getDuplex()House10Floor秒と2Elevator秒でaを返します

私はこれを本当に続けることができました...:D

于 2012-04-12T19:17:17.847 に答える