【问题标题】:How relations in UML class diagram inherit?UML 类图中的关系如何继承?
【发布时间】:2010-01-01 12:45:49
【问题描述】:

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

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

注意:

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

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

谢谢。

【问题讨论】:

    标签: oop inheritance uml class-diagram


    【解决方案1】:

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

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

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

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

    从概念上讲,我们可以说 企业客户是 客户,如果公司的所有实例 根据定义,客户也是 客户的实例。企业 那么顾客就是一种特殊的 客户。

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

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

    从软件的角度来看, 明显的解释是继承: 企业客户是一个子类 的客户。在主流OO中 语言,子类继承所有 超类的特征和可能 覆盖任何超类方法。

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

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

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

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

    但在实施层面,情况就不同了:

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

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

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

    嗯,那是那些日子。

    【讨论】:

      【解决方案2】:

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

      继承是什么意思?

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

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

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

      【讨论】:

      • 谢谢。我不知道为什么我一开始就没有得到……现在很明显。
      • 我认为答案并不那么明显;继承与泛化相关但不完全相同。请参阅下面的答案(评论框太小,无法引用 UML 参考手册中的相关引文)
      【解决方案3】:

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

      比如ClassA依赖ClassB,ClassC会依赖ClassB吗?

      -- 是的:)

      【讨论】:

      • 所有的关系都这样吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多