代码之家  ›  专栏  ›  技术社区  ›  Tamás Szelei

UML类图中的关系如何继承?

  •  3
  • Tamás Szelei  · 技术社区  · 15 年前

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

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

    注:

    • classa classc是泛化关系,箭头应该是实心的。
    • ClassA ClassB位于[依赖项、关联、聚合、组合]之一
    • Unicode很酷,但使用编辑器字体时效果更好:)

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

    谢谢您。

    3 回复  |  直到 14 年前
        1
  •  1
  •   S.Lott    15 年前

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

    继承是什么意思?

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

    在不支持继承的语言中,必须通过确保ClassA的所有特性也是ClassC的一部分来创建正确继承的假象。

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

        2
  •  2
  •   Eric Bréchemier    15 年前

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

    但问题比看起来更复杂;引用《统一建模语言参考手册》第二版:

    单词 一般化 遗传 通常可以互换使用,但是 实际上是两个相关但不同的 概念。泛化是 建模之间的分类关系 元素。它描述了一个元素 . 继承是一种组合共享增量的机制 形成完整的描述 元素的描述。最多 面向对象系统,继承 是基于泛化的,但是 继承可以基于其他 委托等概念 自我语言的指针。基础 上的继承机制 泛化关系使 分解和共享描述 以及多态行为。这就是 大多数面向对象的方法 语言和UML。但请记住 还有其他方法 可能被带走了 用于某些编程语言。

    我记得2003年有一个很长的讲座,讲的是泛化和继承之间的区别。简而言之,这两个概念属于软件设计的不同层次,或者引用UML提炼的第三版“建模的不同视角”中的Martin Fowler的话:

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

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

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

    从软件的角度来看, 显而易见的解释是继承: 公司客户是一个子类 客户的。在主流OO中 语言,子类继承所有 超类的特点和可能 重写任何超类方法。

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

    正方形是一个长方形。这源于他们在数学上的定义:

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

    在设计阶段,正方形和矩形之间存在一个泛化关系。

    但在实施层面,情况并非如此:

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

    继承Square类中Rectangle类的宽度和高度会产生反作用,这需要额外的约束,以确保为宽度的setter和高度的setter提供相同的值。

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

    好吧,就是那些日子。

        3
  •  1
  •   cwap    15 年前

    由于继承是一种“is-a”(非双关语)关系,因此可以将其理解为“ClassC是ClassA,它知道ClassB”,因此:

    例如,当ClassA依赖于ClassB时,ClassC是否依赖于ClassB?

    ——是的: