我正在读一本关于一般面向对象的概念的书,试图对一切事物有一个坚实的理解。有一件事让我感到失望,那就是继承和组合之间的区别。我知道,就继承而言,它是带有子类的" is -a“。例如,Employee类继承自person类,因为员工“是-a”人员。作文的子类是“有-a”。例如,汽车类继承了方向盘类,因为汽车“有-一个”方向盘。
很好,目前为止。但是..。这不还是遗产吗?我理解“是-a”和“有-a”之间的区别。我还了解到,组合基本上是将多个类组合起来,生成包含所有这些对象的另一个类。我有两个问题:
我很清楚这个区别,并且知道如何通过我的程序来利用每一个。我想这只是一个关于语义的问题,构图是否真的是一种继承形式。
发布于 2014-11-17 19:29:31
不,这两个概念是不同的。
一个更好的汽车类比应该是关于发动机。让我们假设我们有一个引擎的接口。它可能具有诸如柱面数和RPM等属性。您可能能够调用诸如打开和关闭节流阀之类的行为。然而,这只是一个接口: engine不是一个实现。car类有一个引擎:当您构建一辆汽车时,您需要安装一些实现该引擎接口的东西。许多汽车有不同的发动机作为选择。
现在有了实现。也许我们定义了一个SixCylinderEngine
类。它是一个引擎,因为它实现了这个接口。它可以在任何使用引擎接口的地方使用。
但是等等!有些人想要一个增压版本的发动机。这并不像改变现有引擎中的变量那样简单,这是一个重大的变化。不同的部分,第二个驱动带,另一个主要部件(增压器),更多的马力,等等。
实现这一目标的一种方法是对SixCylinderEngine
进行子类并添加增压器。这有其优点,但可以在子类和超类之间引入复杂的相互依赖关系。那又是另一种关系。
相反,我们定义了一个直接实现引擎(is-a)的SuperchargedSixCylinderEngine
类。为了重用代码,它内部包含一个SixCylinderEngine
,并委派某些函数(Has)。
从这里开始,下一步是有一个SuperchargedEngine
,它可以接受任何引擎: 6,8,10缸,任何你想要的。
下面是区别的代码示例。
继承:
public int getHorsepower() {
return 1.4 * super.getHorsepower();
}
组成:
private Engine engine;
public SuperchargedEngine(Engine e) {
engine = e;
}
public int getHorsepower() {
return 1.4 * engine.getHorsepower();
}
https://softwareengineering.stackexchange.com/questions/263053
复制相似问题