【问题标题】:Can "is-a" and "has-a" existed at the same time?“is-a”和“has-a”可以同时存在吗?
【发布时间】:2013-08-11 14:49:05
【问题描述】:

假设有两个类,B 类是A 的子类,B 有一个属性a,类似于A,如下面的伪代码所示:

class A {}

class B extends A { 
     A a; 
}

在 UML word 中,类B 和类A 之间有两种关系。 B 'is-a' 类似于 AB 'has-a' 属性为 A。我可以在一个类图中同时表示这些关系吗?

当我用谷歌搜索时,通常在所有结果中两个类之间只存在一种关系。所以我不确定是否允许这样绘制图表。如果不是,UML如何表达这种类之间的关系。

【问题讨论】:

  • 如果你从逻辑上思考,我不认为这是可能的。

标签: uml


【解决方案1】:

当然可以。示例:人类是一种动物,可以将动物作为宠物。 (尽管人们可能想要禁止人类作为宠物的规则。:-))

但是,绝对不会起作用的一件事是使最小基数为 1。这意味着每只宠物也必须有一只宠物!

请注意您的文本、伪代码和 UML 不匹配。您的 UML 图使用 composition,这意味着当我的示例中的宠物死亡时,主人也必须死亡!要解决此问题,您可以使用白色钻石。

【讨论】:

  • 不好的例子。这是“具有”与 UML 的英文含义不匹配的示例。 OP 描述了一种组合关系,即对象 B 的生命周期与对象 A 的生命周期相结合。在您的示例中绝对不是这种情况。
  • 如果 OP 的文本和伪代码与图表匹配,那将是一个公平的观点。即使在您的回答中,您也没有作文示例。
  • @JimL。你确定你了解什么是构图吗?问题和我的回答都说得很清楚。
  • 我手头的UML 2.5草案说,“[composition]表示Property是复合聚合的,即复合对象负责存在和存储组成的对象(部分)。” (重点是我的。)在您的示例中,我假设是 Java,您无法控制 a 的存储(即,它没有嵌入分配给 RedCircle 实例的内存中),如果您通过 @ 987654322@ 到另一个类的操作并且该类保存它,A 的实例可能比RedCircle 的包含实例寿命更长。
  • @JimL。它是一个绑定到对象生命周期的实例变量。实现细节省略
【解决方案2】:

这种方法最常见的应用之一是 Composite design pattern,经常用于表示树状数据结构。

这种模式让您不仅可以表示一棵树(层次结构),而且还可以有效且统一地处理它(通过适当的 operation() 实现)。

编辑

在写这个答案时,我完全忘记了另一个广泛使用的Decorator design pattern,它用于通过继承和包含来增强组件的功能,而不是在无法或不适合直接覆盖方法的情况下简单地扩展它。

【讨论】:

    【解决方案3】:

    这方面的经典例子是:

    A=件 B=CompositePiece(由其他部分组成,无论是否复合)

    【讨论】:

      【解决方案4】:

      是的,这是可能的,但并不常见。请记住,一个类是一个抽象实体,它可以有多个不同的实例,从而允许我们进行这样的构造。

      例如,一个红色的圆圈包含一个圆圈:

      class Circle {}
      
      class RedCircle extends Circle { 
           Circle a; 
           //...
           //more stuff for the red property
      }
      

      【讨论】:

      • 这个有UML规范描述吗?
      【解决方案5】:

      你绝对可以。

      您可以使用它的一个示例是某种自定义 LinkedList,您希望每个节点由于某种原因成为不同的子类。在这种情况下,节点将属于节点类型,但也包含对下一个/上一个节点的引用。

      至于如何在 UML 中表达这一点,我看不出为什么不能用两条线连接同一个框 - 毕竟,它确实有两个独立的关系。

      【讨论】:

      • 一个更好的例子是场景图。基本上是一棵树,其中父类包含某个基类的子类集合。
      • 事实并非如此。它适用于非复合聚合
      • 这个有UML规范描述吗?
      猜你喜欢
      • 2021-11-02
      • 2011-07-29
      • 2011-02-19
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 2011-01-14
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多