1

举个例子, ifHouse是基类,Colonial是 的子类House,Colonial 有一个方法是goUpstairs。还有另一个类称为Mansion,它也是 的子类House,并且Mansion有一个方法useElevator(比如说一个豪宅可以有很多楼层,比如 1 到 35 层)。

事情应该这样开始吗?或者,如果 6 个月后,需要一个新类Duplex,它是 的子类House,并且还需要一个方法goUpstairs?如果我们在and中复制goUpstairs代码,那么它就不是那么 DRY(不要重复自己)。最初的类应该设计不同吗?还是应该在 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)。如果他们共享一些代码或方法,例如goUpor goDown,您可能会有一些接口或基类之类的IVerticalTransport东西。

继续这个思路,你也会有一个Floor对象。AnIVerticalTransport将连接一个或多个Floors,而这些 s 又将包含在 a 中House

稍微扩展一下以再次包括您提到的 Mansion 和 Duplex 概念,拥有一个HouseFactory. AHouseFactory将具有House使用特定设置配置 s 的方法。

  • HouseFactory.getMansion()将返回 a House4 Floors 和几个Stairs
  • HouseFactory.getDuplex()将返回House10Floor秒和 2Elevator秒的a
  • 等等

我可以继续这样做真的......:D

于 2012-04-12T19:17:17.847 回答