UML中实现继承对应的关系是什么?

What is the relationship corresponding to implementation inheritance in UML?

当前UML specification(2.5.1,2017年12月)实现继承(C++中用私有继承实现)对应的关系是什么?

不要与 接口继承(子类型化)混淆,后者在 UML 中对应于 接口实现 关系,用虚线和空心三角形,也不具有 实现和接口继承 (subclassing),它在 UML 中对应于 泛化 关系,由实体表示线条和空心三角形。

注意。 — Erich Gamma 等人的 设计模式 一书。发表于 1994 年(在 UML 之前),其 class 图基于 OMT(UML 的祖先),非正式地使用实线和空心三角形以及“(实现)”修饰符来表示实现继承:

图。 — class 适配器设计模式的 OMT class 图。

GoF 术语

GoF 提出了一些您似乎已经采用的术语(第 13-15 页):

  • 一个对象打包数据(它的状态)和过程(它的方法)是访问数据的唯一方法(状态封装)。
  • 对象的接口是其方法签名集。
  • a type 是特定接口的名称。
  • a subtype 是另一种类型的超集类型。
  • a supertype 是另一种类型的子集类型。
  • 对象的实现是其状态和方法实现的集合。
  • a class 定义对象的接口和实现。
  • a subclass 定义一个 class 是另一个 class 的超集.
  • a superclass 定义一个 class 是另一个 class 的子集.
  • 继承在这个理解上对应于重用一个实现。

这种理解是由重用驱动的,这是他们书中的主要主题:类型只是接口的重用,而 classes 是实现的重用。这种观点是还原论者:

  • 没有提到接口背后的承诺和期望(例如,如果我先 push() 在其上编辑了一些东西,我只能从堆栈中 pop() )。只是接受接口定义的请求的能力。
  • 抽象class(定义接口但不提供实现)和接口之间的区别根本没有阐明。

最后一点在您的图形示例中得到了完美的说明。

  • 在 GoF 叙述中,TargetAdaptee 都被定义为接口(参见第 141 页,“参与者”部分),而 Adapter 实现了这些接口。
  • 然而,在架构中,Target 表示为抽象 class(参见第 365 页),AdapterRequest() 是通过调用 SpecificRequest() 但没有显示 Adapter 也必须实现 SpecificRequest()
  • 最后,GoF 解释说 AdapterAdaptee 的子 class,这似乎有些不一致。

UML 透视图

接口的 UML 定义更接近 Liskov 所谓的类型:

An Interface […] represents a declaration of a set of public Features and obligations that together constitute a coherent service. An Interface specifies a contract […]. The obligations associated with an Interface are in the form of constraints (such as pre- and postconditions) or protocol specifications, which may impose ordering restrictions on interactions through the Interface. Interfaces may not be instantiated. Instead, an Interface specification is implemented or realized […].

类 定义功能集,可以实现接口并可以实例化。

你所说的接口继承有歧义:

  • 如果你说的是实现接口的class,就是接口实现,用虚线表示,在要实现的接口边上空心三角形
  • 如果您指的是一个接口继承了另一个接口(子类型),它就是接口特化,用一条普通的线表示,在更通用的接口一侧有一个空心三角形。

你所说的实现和接口继承是模棱两可的,因为不清楚继承是否只适用于接口实现:

  • 如果你的意思是用一个已经存在的接口实现class,那就是接口实现,用虚线表示,接口边上有空心三角形。
  • 如果您指的是接口及其实现的同时继承,那么它就是 class 特化,用一条普通线表示,在更通用的 class 一侧带有一个空心三角形.

如果使用 实现继承 你想继承实现而不继承接口,即私有继承,那么 UML 中没有什么特别预见的,你必须翻译你的UML 概念中的实现意图,如 this SO question.

中的示例所述

现在为了说明图形符号,这里是 class GoF 中使用参与者角色描述的适配器模式:

如果考虑到 Adaptee 实际上是一个需要调整的现有实现,这里是一个更符合逻辑的图: