【发布时间】:2021-12-17 01:52:04
【问题描述】:
如何知道A类是接口、抽象类还是具体类(超类)?
但是,在第二张图片中:
B 也应该是一个抽象,如果第一个理论是正确的......但它不能,因为在最后一个答案中有 B 类的直接实例。
【问题讨论】:
标签: interface uml abstract-class class-diagram
如何知道A类是接口、抽象类还是具体类(超类)?
但是,在第二张图片中:
B 也应该是一个抽象,如果第一个理论是正确的......但它不能,因为在最后一个答案中有 B 类的直接实例。
【问题讨论】:
标签: interface uml abstract-class class-diagram
如果 A 在 image1 中是抽象的,它会以斜体显示名称和/或旁边的字符串 {abstract}。这不是这里的情况。因此 A 可以 有直接实例。我猜image1有错误。
请注意,即使 image2 中的 B 是抽象的,指定 B 的实例也是有意义的。实例说明不是实例,因此可以是不完整和抽象的。一个对象将具有完整的特征和一个具体的类。例如我可以有一个红色的Basketball。在模型中,我可能有一个由Ball{abstract} 分类的实例规范,并且没有颜色插槽,因为我不在乎它是哪种类型和颜色。所以Basketball 或Handball 的任何instance 都将符合此实例规范。
【讨论】:
根据 UML 规范,第 9.2.3.2 节:
Classifier 的 isAbstract 属性为真时,指定 Classifier 是抽象的,即没有直接实例:抽象 Classifier 的每个实例都应是其特化之一的实例。
在第 9.2.4.1 节中进一步描述了该符号:
在使用字体允许的情况下,抽象分类器的名称以斜体显示。或者或此外,抽象分类器可以在其名称之后或下方使用文本注释 {abstract} 来显示。
第一个图中两者都没有,所以答案是完全错误的。
注意,抽象类的另一个间接指示(虽然没有直接提及,只是来自一般描述)可能是使用泛化集。这里使用了几个符号,你可以在第 9.7.4 节中阅读它们(整个第 9.7 节都是关于泛化集的)。这个符号也没有被使用 - 没有任何迹象表明类 A 是抽象的。
【讨论】:
如果A是一个接口、一个抽象类或一个具体类,你不能从图中推断:
A 可以是一个具体的类,由 B 和 C 进一步专门化
A 可以是抽象类,B 和 C 可以是抽象或具体的特化。人们会期望 A 使用斜体或后跟 {abstract} 装饰,但这些不是强制性的。A 在某些情况下甚至可能是一个接口。在这种情况下,B 和 C 将是专用接口。然而,这种可能性的可能性很小,因为 «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 是否抽象。
【讨论】:
«interface»。但是您的参考非常有趣:在一个地方显然是可选的,但在另一个地方是强制性的,这令人困惑。在 UML 2.5 中,我的第三个项目符号将被删除。然而,叙述中说的是 UML2,而 UML2.0/superstructure 没有带有默认符号的措辞:“作为分类器,接口可以使用带有关键字«interface»的矩形符号显示名字”。