子类作为类的集合

时间:2013-06-20 04:23:27

标签: design-patterns inheritance

在Java中我们可以(假设额外的构造方法等):

class Car
{
    public void Vrooom() { System.out.print("Vrooom!"); }
}

class Prius extends Car
{
    public void Vrooom() { System.out.print("..."); }
}

class Cars extends Car
{
    private ArrayList<Car> mCars;
    public void Vrooom() { for(Car car: mCars) car.Vrooom(); }
}

我遇到过这样的代码,但Cars对我来说感觉不对,因为它必须覆盖每个Car方法以添加for循环。这是一种反模式,如果是这样,我为什么不这样做呢?

2 个答案:

答案 0 :(得分:2)

你是对的,有些事情感觉错了。在我看来,object的集合不应该扩展object

可能是你有经销商持有一些汽车的情况,但我认为你会这样做(而且我不是java所以我可能会搞砸一些语法):

class Dealership extends Businesses
{
    private private ArrayList<Car> sellableCars;

    public void itsAHugeSalesSpectacular() {
        for(Car car: sellableCars) car.Vrooom(); 
    }
}

但根据我的经验,你没有理由将经销商的汽车本身定义为一个对象。

答案 1 :(得分:2)

您是否继承汽车代表汽车列表?你不需要这样做。如果您只想要一个汽车列表,那么您可以创建

List<Car> list = new ArrayList<Car>();

继承意味着子类应该通过超类的IS-A测试,在您的情况下,汽车列表并不完全是汽车。