3

我想知道关联、依赖关系和此类关系如何在 UML 中继承(或者说,一般来说)。所以,在这样的情况下:

  ┌──────────┐                                        ┌──────────┐
  │  ClassA  │                                        │  ClassB  │
  ├──────────┤                                        ├──────────┤
  │          │─────────"One kind of relation"────────>│          │
  ├──────────┤                                        ├──────────┤
  │          │                                        │          │
  └──────────┘                                        └──────────┘
        ^
       /┬\
        │
        │
        │
        │
  ┌─────┴────┐
  │  ClassC  │
  ├──────────┤
  │          │
  ├──────────┤
  │          │
  └──────────┘

笔记:

  • ClassA-ClassC 是泛化关系,箭头是实心的
  • ClassA-ClassB 在 [依赖、关联、聚合、组合] 之一
  • Unicode 很酷,但使用编辑器字体看起来好多了:)

我的问题是,这些关系如何继承?例如,当 ClassA 依赖于 ClassB 时,ClassC 会依赖于 ClassB 吗?等等

谢谢你。

4

3 回答 3

3

简单的答案是肯定的(你不应该为了最实际的目的而超越它)。

但事情比看起来要复杂得多。引用统一建模语言参考手册,第二版:

泛化继承这两个词经常互换使用,但实际上有两个相关但不同的概念。泛化是建模元素之间的分类关系。它描述了一个元素 是什么. 继承是一种组合共享增量描述以形成元素的完整描述的机制。在大多数面向对象的系统中,继承是基于泛化的,但继承可以基于其他概念,例如Self语言的委托指针。基于泛化关系的继承机制使得描述和多态行为的分解和共享成为可能。这是大多数面向对象语言和 UML 采用的方法。但请记住,还有其他方法可以采用,并且某些编程语言会使用这些方法。

我记得在 2003 年,关于泛化和继承之间的区别的相当长的演讲。总之,这两个概念属于软件设计的不同层次,或者引用UML Distilled,第三版中的Martin Fowler,“建模的各种观点”:

从概念上讲,如果根据定义,企业客户的所有实例也是客户的实例,我们可以说企业客户是客户的子类型。企业客户是一种特殊的客户。

泛化的概念属于概念、设计层面。

但是继承是一个属于实现视角的概念:

从软件的角度来看,明显的解释是继承:Corporate Customer 是 Customer 的子类。在主流 OO 语言中,子类继承了超类的所有特性,并且可以覆盖任何超类方法。

我记得一个例子,泛化和继承之间的区别真的很有意义:

正方形是长方形。这来自他们在数学中的定义:

  • 矩形是有四个直角的四边形
  • 正方形是具有四个相等边和角的多边形

在设计层面,正方形和长方形之间存在泛化关系。

但在实施层面,情况有所不同:

  • 一个矩形可以通过两个度量来定义:它的宽度和高度
  • 一个正方形可以用一个度量来定义,因为所有边都是相等的

在 Square 类中继承 Rectangle 类的宽度和高度会适得其反,这将需要额外的约束来确保为宽度的设置器和高度的设置器提供相同的值。

这是一种情况(我承认有些前卫),您不会将泛化关系转换为在实现级别使用继承。

嗯,那是那些日子。

于 2010-01-04T14:36:30.380 回答
1

由于继承是一种“is-a”(没有双关语)关系,您可以将其解读为“ClassC 是 ClassA,它知道 ClassB”,所以:

例如,当 ClassA 依赖于 ClassB 时,ClassC 会依赖于 ClassB 吗?

- 是的 :)

于 2010-01-01T12:48:59.487 回答
1

您不是在问 UML 问题,而是在问一个更一般的问题。

继承是什么意思?

ClassC 是 ClassA 的子类。在每一种实现继承的编程语言中,ClassC 都会具有 ClassA 的所有特性。

在不支持继承的语言中,您必须通过确保 ClassA 的所有功能也是 ClassC 的一部分来创建正确继承的错觉。

这就是继承的定义。永远永远。即使在 UML 图中。

于 2010-01-01T13:14:07.123 回答