在 UML 中,如果接口与类有关系,那么这种关系是否也适用于实现它的任何类?

jak*_*s42 4 java uml class-diagram interface associations

因为任何实现接口的类都与所述接口具有相同的类型,所以与接口的任何关系也适用于实现它的任何类吗?

例如,假设我们有一个名为 Product 的接口,它有一个方法签名,它返回类 Colour 的一个实例。然后我们有 2 个实现这个接口的类,称为 Shelf 和 Desk。这两个类包含类 Colour 的一个属性。

关系的 UML 示例 1

或者

UML 关系示例 2

是否只需要在 Product 和 Color 之间显示关系,还是 Product、Shelf 和 Desk 都需要显示它们与类 Colour 的关系?

Chr*_*phe 5

接口的关联是否适用于它们的实现?

一个接口定义了一个契约,说明实现类必须提供的特性和它们必须满足的约束。如果接口与类 T 有关联,则其所有实现的行为都必须完全像它们也与类 T 有关联一样。

以下是 UML 规范告诉我们的:

接口拥有的属性(包括关联端)意味着实现的 BehavioredClassifier 应该维护与属性的类型和多样性相对应的信息,并促进该信息的检索和修改。在接口声明的属性并不一定意味着在实现 BehavioredClassifier 上会有这样的属性(例如,它可以通过等效的 get 和 set 操作来实现)。

所以你的问题的答案是模棱两可的:

  • 如果您正在使用实现类,您可以假设它具有这样的关联,即使它没有显示在图中。
  • 如果你正在设计这样一个实现类,你不能假设关联是自动存在的: 实现不是继承。如果您没有在模型中显示任何内容,则未指定该类将如何履行其合同。如果你想完整,你必须在实现类中定义必要的关联:因此第二个图会更准确和全面。

对于其中一个实现,您还可能有一种不同的情况,即关联派生自其他关联,而不是显式维护。

你的叙述真的需要联想吗?

在您的叙述中,您证明需要关联是因为方法返回 T 类型。但具有参数或返回类型不足以要求关联,如this other SO answer 中所述。关联需要语义关系

因此,您的界面更可能依赖于Color.

杂记

在这两个图中,您应该使用一个普通的空白箭头(末端的白色三角形)而不是一个开放的箭头末端来显示实现依赖关系。

在较早的 UML 版本 1.xx 中,接口具有等同于抽象类的语义,并且不允许拥有自己的属性。虽然现在事情更轻松了,但我建议坚持使用这种方法,因为:

  • 接口意味着提供一组行为
  • 行为在操作中实现
  • 私有属性对外界不可见,因此在接口中无关。由于存在封装和解耦的风险,因此应避免使用公共属性。
  • 如果你真的需要一个属性,它可能是需要一个类的症状。