面向对象理论诞生之初,由于没有最佳实践的指导,往往导致继承的滥用。一个很著名的例子就是java类库中的堆栈类Stack继承自向量类Vector。
public
class
Stack
extends
Vector
...
{

public Object push(Object item) ...{
addElement(item);
return item;
}

public synchronized Object pop() ...{
//...
}
}
public
class
Stack
...
{
private Vector vector;

public Object push(Object item) ...{
vector.addElement(item);
return item;
}
//...
}













仅仅是为了重用Vector的管理元素的方法,就让Stack继承自Vector,导致了一个蹩脚的设计。人们后来总结出一条规律:优先使用组合而不是继承,只有当类A确实"is a"类B的时候,才使用继承。Stack不是Vector,所以这个时候应该使用组合。示例代码如下:










只有符合"is a"关系时才能使用继承,这条规律是