首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >继承、组合和协议

继承、组合和协议
EN

Software Engineering用户
提问于 2014-11-17 19:02:25
回答 1查看 2.5K关注 0票数 8

我正在读一本关于一般面向对象的概念的书,试图对一切事物有一个坚实的理解。有一件事让我感到失望,那就是继承和组合之间的区别。我知道,就继承而言,它是带有子类的" is -a“。例如,Employee类继承自person类,因为员工“是-a”人员。作文的子类是“有-a”。例如,汽车类继承了方向盘类,因为汽车“有-一个”方向盘。

很好,目前为止。但是..。这不还是遗产吗?我理解“是-a”和“有-a”之间的区别。我还了解到,组合基本上是将多个类组合起来,生成包含所有这些对象的另一个类。我有两个问题:

  1. 从某些方面来说,构图不是继承的一种形式吗?
  2. 把这个打出来,我可能回答了我自己的问题。在Objective中,我们使用协议来指定哪些需要继承,哪些是可选的。简单地将一个协议扔进报头是什么区别了继承和子类?我们在继承和组合中都使用协议吗?

我很清楚这个区别,并且知道如何通过我的程序来利用每一个。我想这只是一个关于语义的问题,构图是否真的是一种继承形式。

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2014-11-17 19:29:31

不,这两个概念是不同的。

一个更好的汽车类比应该是关于发动机。让我们假设我们有一个引擎的接口。它可能具有诸如柱面数和RPM等属性。您可能能够调用诸如打开和关闭节流阀之类的行为。然而,这只是一个接口: engine不是一个实现。car类有一个引擎:当您构建一辆汽车时,您需要安装一些实现该引擎接口的东西。许多汽车有不同的发动机作为选择。

现在有了实现。也许我们定义了一个SixCylinderEngine类。它是一个引擎,因为它实现了这个接口。它可以在任何使用引擎接口的地方使用。

但是等等!有些人想要一个增压版本的发动机。这并不像改变现有引擎中的变量那样简单,这是一个重大的变化。不同的部分,第二个驱动带,另一个主要部件(增压器),更多的马力,等等。

实现这一目标的一种方法是对SixCylinderEngine进行子类并添加增压器。这有其优点,但可以在子类和超类之间引入复杂的相互依赖关系。那又是另一种关系。

相反,我们定义了一个直接实现引擎(is-a)的SuperchargedSixCylinderEngine类。为了重用代码,它内部包含一个SixCylinderEngine,并委派某些函数(Has)。

从这里开始,下一步是有一个SuperchargedEngine,它可以接受任何引擎: 6,8,10缸,任何你想要的。

下面是区别的代码示例。

继承:

代码语言:javascript
运行
复制
public int getHorsepower() {
  return 1.4 * super.getHorsepower();
}

组成:

代码语言:javascript
运行
复制
private Engine engine;

public SuperchargedEngine(Engine e) {
  engine = e;
}

public int getHorsepower() {
  return 1.4 * engine.getHorsepower();
}
票数 8
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/263053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档