【问题标题】:UML Class Diagram - abstract or interface?UML 类图 - 抽象还是接口?
【发布时间】:2021-12-17 01:52:04
【问题描述】:

如何知道A类是接口、抽象类还是具体类(超类)?

根据答案,没有 A 的直接实例,所以我假设这是一个抽象类。


但是,在第二张图片中:

B 也应该是一个抽象,如果第一个理论是正确的......但它不能,因为在最后一个答案中有 B 类的直接实例。

【问题讨论】:

    标签: interface uml abstract-class class-diagram


    【解决方案1】:

    如果 A 在 image1 中是抽象的,它会以斜体显示名称和/或旁边的字符串 {abstract}。这不是这里的情况。因此 A 可以 有直接实例。我猜image1有错误。

    请注意,即使 image2 中的 B 是抽象的,指定 B 的实例也是有意义的。实例说明不是实例,因此可以是不完整和抽象的。一个对象将具有完整的特征和一个具体的类。例如我可以有一个红色的Basketball。在模型中,我可能有一个由Ball{abstract} 分类的实例规范,并且没有颜色插槽,因为我不在乎它是哪种类型和颜色。所以BasketballHandball 的任何instance 都将符合此实例规范

    【讨论】:

    • {abstract} 和斜体不是可选的吗? (见我对ister的回答的评论)
    • @Christophe 这句话说“以斜体显示”,而不是“可能以斜体显示”。不支持斜体的字体例外很奇怪。当前使用的哪些字体不支持它们?对我来说,这仍然不是可选的。它更像是“如果你真的必须使用一个糟糕的工具,不要太担心斜体”。我在字里行间读到,第二句话的意思是,在这种情况下,要使用文本注释。
    • 再读一遍,它仍然显得比预期的要柔和:不是“显示……除了……”而是“显示……在允许的地方”,对于“允许”的真正含义没有任何规定。问题是,即使我同意你的观点,指定的方式也留下了解释的空间,你无法避免有人可以用更轻松的方式解释它。
    【解决方案2】:

    根据 UML 规范,第 9.2.3.2 节:

    Classifier 的 isAbstract 属性为真时,指定 Classifier 是抽象的,即没有直接实例:抽象 Classifier 的每个实例都应是其特化之一的实例。

    在第 9.2.4.1 节中进一步描述了该符号:

    在使用字体允许的情况下,抽象分类器的名称以斜体显示。或者或此外,抽象分类器可以在其名称之后或下方使用文本注释 {abstract} 来显示。

    第一个图中两者都没有,所以答案是完全错误的。

    注意,抽象类的另一个间接指示(虽然没有直接提及,只是来自一般描述)可能是使用泛化集。这里使用了几个符号,你可以在第 9.7.4 节中阅读它们(整个第 9.7 节都是关于泛化集的)。这个符号也没有被使用 - 没有任何迹象表明类 A 是抽象的。

    【讨论】:

    • 我同意答案显然具有误导性。但是,该符号并不强制您披露类的抽象性。在规范中讲 MAY 表示一种可能性并且必须是一种义务。 “alternatively 或 addition 是一个可选符号,与“允许使用字体的情况下的斜体”完全一样
    • (参见datatracker.ietf.org/doc/html/rfc2119:UML 规范没有明确提到这一点,但在第 5.1 节中它提到了具有完全相同约定的 ISO 指南)
    • 我认为它确实有义务。请参阅我对我的回答的评论。
    • 好吧,根据 OP 提供的图表,没有信息强制抽象,因此无法从中派生类 A is 抽象的信息。我并没有说 A 肯定不是抽象的,只是在图中没有任何迹象表明它不应该被假定为允许选择基于 A 抽象的答案的级别。
    【解决方案3】:

    第一张图

    如果A是一个接口、一个抽象类或一个具体类,你不能从图中推断:

    • A 可以是一个具体的类,由 BC 进一步专门化
    • A 可以是抽象类,BC 可以是抽象或具体的特化。人们会期望 A 使用斜体或后跟 {abstract} 装饰,但这些不是强制性的。
    • A 在某些情况下甚至可能是一个接口。在这种情况下,BC 将是专用接口。然而,这种可能性的可能性很小,因为 «interface» 关键字应该高于 A。此符号在早期的 UML 2 版本中不是强制性的,但当前的 UML 2.5 需要它(请参阅 Axel 的评论)。

    因此,如果使用 UML 表示法尽可能准确,A 将是一个具体的类,但客观上你不能 100% 确定。

    重要提示:所提供的声称“A 没有实例”的答案是传闻。图中没有任何元素可以得出这个结论

    第二张图

    我们已经看到第一个问题的答案是有缺陷的,同样,B 不一定是一个抽象类。

    重要启示:你需要知道b : B 是可能的,即使B 是抽象的,因为在对象图中你可以任意选择显示一个类的成员资格,如果对象会更专业:

    UML 2.5 - 第 9.8.3 节:InstanceSpecification 表示建模系统中可能或实际存在的实例以及完全或部分描述这些实例。

    如有疑问,几行之后,您将阅读:

    InstanceSpecification 可以表示:
    - 通过一个或多个分类器对实例进行分类,其中任何一个都可以是抽象的

    记住这一点,第二张图的答案都是正确的,无论 B 是否抽象。

    【讨论】:

    • 我认为显示某事物是一个接口不是可选的:“UML 2.5.1:可以使用 Classifier 的默认符号和关键字 «interface» 指定一个接口。”。默认符号表示“对应于分类器的元类的关键字应显示在名称上方的 guillemets 中。”。还有另一种显示接口的选项,但如果你不使用它,唯一定义的符号是默认符号。
    • @AxelScheithauer 我强烈推荐«interface»。但是您的参考非常有趣:在一个地方显然是可选的,但在另一个地方是强制性的,这令人困惑。在 UML 2.5 中,我的第三个项目符号将被删除。然而,叙述中说的是 UML2,而 UML2.0/superstructure 没有带有默认符号的措辞:“作为分类器,接口可以使用带有关键字«interface»的矩形符号显示名字”。
    • @AxelScheithauer 我稍微编辑了第三个项目符号以反映这种交流。感谢您最后的参考。
    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2018-09-09
    • 2011-05-22
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多