你有概念颠倒。
继承,正如这个词所说的那样,当你从一个现有对象中“获取”这个功能。这被称为IS-A关系。例如卡车IS-A车辆。
在你的第一个不是继承的例子中,因为你没有从列表中取出任何东西。在您的示例中,您正在“实施”该列表不是“扩展”它。
构图是当你使用他人(你正在组合对象)建立一个对象。这被称为HAS-A关系。例如卡车HAS-A车轮(但不是车轮)。在您的示例中,您正在“扩展”(继承)其他对象
最后OOP中的接口是对象承诺履行的“合同”。对象将响应什么函数或消息。
在Java中,“接口”也是定义对象响应的方法的工件。
因此,对于栈你将不得不然后,使用继承您可以创建堆栈实现定义一个协议栈所拥有的方法(接口)
public interface Stack {
public void push(Object o);
public Object pop();
}
。要做到这一点,你必须扩展(或继承)其他类的功能。我们假设ArrayList
/**
* Sample stack implementation using inheritance
*/
public class ArrayListStack extends ArrayList implements Stack {
// you use the keyword extends because you're inheriting from ArrayList
// and the keyword implements because you claim to respond to push and pop methods.
public void push(Object o) {
this.add(o); // add inherited from ArrayList
}
public Object pop() {
return this.remove(this.size() -1); // remove inherited from ArrayList
}
}
由于您是从ArrayList“继承”,所以大部分您所需要的已经存在。但是,这是否代表IS-A关系?一个Stack IS-ArrayList总是这样吗?
要使用构图来实现堆栈,您必须将对象与另一个“结合”。
/**
* Sample stack implementation using composition
*/
public class ComposedStack implements Stack {
// you didn't extend anything here
// But you'll need another object to help you
// to do the work.
private ArrayList holder = .... // Should be declared as List holder = ....
public void push(Object o) {
this.holder.add(o);
}
public Object pop() {
return this.holder.remove(this.holder.size() -1);
}
}
的实施是非常相似的,你使用“添加”,从ArrayList中
所不同的是“删除”方法使用继承你不仅使用这些第一案两种方法,但是你完全将你的对象耦合到ArrayList本身(因为你也继承了所有其他方法,并且属性ArrayList具有)
当您使用组合时,您不会将对象arrayl ist(或耦合很低,这是一件好事)您只是使用另一个对象来帮助您完成这项工作。在这种情况下,它是一个ArrayList。
从外部(使用合成),你没有看到里面有一个ArrayList,这是信息隐藏。你的课程的用户(客户端)只能看到两种可用的“推”和“流行”方法,而你的课堂上没有什么可以做的。它看起来像一个“真正的”堆栈。
对于继承(使用extends关键字),类的客户端也会看到ArrayList中的所有方法,尽管您可能希望只使用弹出和推式,但并不妨碍客户端使用“removeRange”。
结论:了解is-a和has-a关系之间的差异对于OO技术是必不可少的。我希望这对你有所帮助。
家庭作业,对吧? – cletus 2009-09-13 23:37:07