【发布时间】:2013-06-20 04:23:26
【问题描述】:
在 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 循环。这是一个反模式吗?如果是,我为什么不这样做?
【问题讨论】:
-
继承应该代表一个is-a关系。您通常不会说一系列汽车是汽车。
-
我同意@VaughnCato,通常你会从数组类型(或任何等效的java类)扩展你的
Cars类,或者只是使用一个通用列表来代替它(如果你不需要带有辅助方法的强类型表示等)。此外,对于您不应该这样做的原因,通过扩展Car,没有什么可以阻止您将Cars添加到您的列表中。毕竟,您是在说“汽车就是汽车”。
标签: design-patterns inheritance