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

标签 java interface uml associations class-diagram

因为任何实现接口(interface)的类都与所述接口(interface)的类型相同,所以与接口(interface)的任何关系是否也适用于实现它的任何东西?
例如,假设我们有一个名为 Product 的接口(interface),它有一个返回 Colour 类实例的方法签名。然后我们有 2 个类实现了这个接口(interface),称为 Shelf 和 Desk。这两个类包含类 Colour 的一个属性。
UML example of relationships 1
或者
UML example of relationships 2
关系是否只需要显示在 Product 和 Color 之间,还是 Product、Shelf 和 Desk 都需要显示它们与类 Colour 的关系?

最佳答案

接口(interface)的关联是否适用于它们的实现?
接口(interface)定义了一个契约,说明实现类必须提供的特性和它们必须满足的约束。如果一个接口(interface)与一个类 T 有关联,那么它的所有实现必须完全像它们也与一个类 T 有关联一样。
以下是 UML 规范告诉我们的内容:

Properties owned by Interfaces (including Association ends) imply that the realizing BehavioredClassifier should maintain information corresponding to the type and multiplicity of the Property and facilitate retrieval and modification of that information. A Property declared on an Interface does not necessarily imply that there will be such a Property on a realizing BehavioredClassifier (e.g., it may be realized by equivalent get and set Operations).


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

  • 对于其中一种实现,您还可能遇到不同的情况,其中关联源自其他关联并且未明确维护。
    你的叙述真的需要关联吗?
    在您的叙述中,您证明需要关联是因为返回类型 T 的方法。但是具有参数或返回类型不足以要求关联,如 this other SO answer 中所述。 .关联需要 semantic relationship .
    因此,您的界面更可能依赖于 Color .
    杂项备注
    在这两个图中,您应该用一个普通的空白箭头(末端的白色三角形)而不是一个开放的箭头末端来显示实现依赖关系。
    在较旧的 UML 版本 1.xx 中,接口(interface)具有等同于抽象类的语义,并且不允许有自己的属性。虽然现在情况更加轻松,但我建议坚持使用这种方法,因为:
  • 接口(interface)意味着提供一组行为
  • 行为在操作中实现
  • 私有(private)属性对外界不可见,因此与接口(interface)无关。由于存在封装和解耦的风险,应避免使用公共(public)属性。
  • 如果你真的需要一个属性,它可能是需要一个类的征兆。
  • 关于java - 在 UML 中,如果接口(interface)与类有关系,这种关系是否也适用于实现它的任何类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64866310/

    相关文章:

    java - 从 jar 访问 jar 外的资源

    Java 正则表达式,无法正确捕获最后一组

    java - 扩展 JFrame(空窗口错误)

    php - 为 php 项目生成类图(codeigniter 框架)

    database-design - 您应该如何对随时间变化的对象进行建模

    生成对象的 Java 方法

    java - RGB 颜色空间到原始颜色名称的映射

    Java接口(interface)和抽象中的返回类型

    java接口(interface)方法从子类中删除

    java - 覆盖接口(interface)中的方法是否有意义