【问题标题】:UML and constraint and association/aggregationUML 和约束以及关联/聚合
【发布时间】:2013-01-17 15:12:49
【问题描述】:

想请教一下以下情况:

有一个名为 A 的类。它包含(聚合)两个类(B 和 C),但它们不是继承自同一个基类。 是否可以将 B 和 C 关联到 A 并使用带有 {or} 的约束,但在 A 侧只有一个引用? 另一个解决方案可以是使用接口(Iface),所以我可以将A与Iface相关联,B和C可以实现Iface。 但问题是我可以为此使用约束吗? (正如我发现的,将 B 和 C 关联到 A 意味着 A 将包含 B 的引用和 C 的其他引用)。

谢谢你,

费伦茨

【问题讨论】:

  • 你在处理什么级别的类图?您提到 A“将包含一个引用”,这意味着您正在从中生成代码 - 如果是这样,您希望对 B|C 的引用的类型是什么?
  • 嗨皮特!我问这个是因为我认为如果我将 B 和 C 关联到 A 并且 B 和 C 没有相同的基类,那么 A 将包含 2 个属性/引用/属性,而不仅仅是一个。如果这是真的,那么我不能使用约束来简化我所描述的图表,但我必须使用由 B 和 C 实现的接口,或者我需要从同一个基类(如 Eoin 的图表)继承 B 和 C。还是我错了?

标签: associations uml constraints aggregation


【解决方案1】:

我认为您要问的是您是否可以为 A 建模,使其具有与另一个对象的单一关联,该对象可以是 B 或 C 类型。对吗?

在这种情况下,您不需要约束,只需要从 A 到新类(称为“D”)的关联,然后 B 和 C 将从 D 继承,如下所示:

这当然意味着您必须确定 B 和 C 的共同特征才能将其分解为 D 以允许可替代性。而A只能依赖B和C的那些特性。

如果您需要 A 与 B 或 C 有常规关联并且不能使用继承,那么您需要使用 {or} 约束的单独关联,因为您已正确识别。

【讨论】:

  • 你好 Eoin!对不起,也许是误会了。让我们看看你的例子:有一个类名 A。我想将 C 类和 B 类关联到 A 类,我只想看到 A 类中的一个字段。但是 B 类和 C 类没有相同的基类。我可以用 A 和 B 之间的关联以及 A 和 C 之间的关联来展示它,并同时使用关联的 {or} 约束吗?
  • 在 A 中只有一个字段来引用两种可能的类型对我来说没有多大意义。在编程语言中执行此操作的方法是引用 Object 类型(所有其他类的基类),然后您可以通过该引用引用任何对象。但是,除非您将引用转换为特定类型(有效地围绕类型系统工作),否则您无法对该对象引用执行任何特定操作。
  • 您能否更具体地解释您要建模的内容以及为什么只需要一个参考?
  • 您好!这个有约束的版本不是我的主意。我说我必须应用一个继承(正如你向我展示的那样)或一个由 B 和 C 实现并由 A 聚合的接口。但我知道它太复杂了,可能会受到约束。我觉得不太一样……我看了OMG的UML规范,但是没有找到这种情况的规则……
  • 你是对的,使用 {or} 约束和使用继承是不同的。一个将导致对对象的单个(多态)引用,该对象只能用作它引用的共享基类型的实例。另一个导致两个引用,一个指向 ClassB,一个指向 ClassC,在任何时候填充一个或另一个。在这种情况下,您可以使用 ClassB 或 ClassC 的所有功能。两者都不是“正确的”,两者都是有效的,你只需要决定哪一个适合你的情况。这是一个建模判断的问题。
猜你喜欢
  • 2012-03-27
  • 2013-05-14
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2017-06-24
  • 2017-07-26
  • 2014-09-18
相关资源
最近更新 更多