Enterprise Architect 和 UML:选择接口或抽象时的微妙之处 class

Enterprise Architect & UML: subtleties when choosing interface or abstract class

我目前正在从现有的 C++ 代码构建模型。有一个(可动态加载的)库因此必须 implement/provide 定义的接口 (class)。使用的 class 有一些纯虚函数,但不可否认,它不是一个纯接口(在 Java 意义上),因为它也是一个包含状态(成员)的基础 class ) 和一些方法实现。

所以它是一种混合 - C++ 中的基础 class 现实,但在其主要 目的 中是一个接口.

注意:我无意生成一些代码,但出于文档目的,模型应该是正确的。

在EA(12)中画例子时,出现一些问题:

a) 是否有任何重要原因更喜欢 class 并使其成为 'abstract'(灰色框 "Base"),或者我应该直接使用工具箱中的界面(紫色框 "Base2")?到目前为止,除了颜色,我没有注意到 EA 中的任何行为差异。

b) 如何抑制写在方法后面的刻板印象{abstract}?当我 not 将它们设置为 "abstract" 时,它们不会以斜体字母绘制。但我希望它们是斜体的,没有“{abstract}”。

c) 关于 class/interface 框的类似问题:按定义接口不是抽象的吗?那么,为什么 EA 会在此处添加 {abstract} 文本?将 class 名称绘制为斜体就足够了。

d) 我猜最左边的箭头(一个基础的泛化class)和最右边的箭头(一个接口的实现)是正确的,而中间的则不正确。对吗?

a) 任选其一,但要保持一致。区别有点深奥,除了极少数情况下不值得 (YMMV)。

b) 看起来你用值 abstract

填充了 Context/Advanced/Multiplicity

c) 是的。接口是抽象的,如果您查看“详细信息”选项卡,您会看到 Abstract 框已勾选且无法更改。我不知道大括号中的文字是从哪里来的。这不是刻板印象。我可以像那样显示它的唯一方法是将类型从 int 更改为 int {abstract}.

d) 您可以在 class 中实现多个接口,因此理论上所有连接器都可以。所以Derived实现了两个接口。

编辑 正如@minastros 自己发现的(并私信我),罪魁祸首是 EA 选项中的无数标志之一:

正如 Thomas 所提到的,从技术上讲,接口 抽象 class,尽管抽象 class 并不总是接口。如果您有一个操作(方法)未实现,class 是抽象的,因此如果实现了 none 个操作,则 class 也是抽象的。 "abstract class" 通常只被认为是具有部分实现的 class,因为这样的抽象 class 与接口不同。但是,没有实现的 class——一个接口——技术上也是一个抽象 class。

这可能就是 EA 将 {abstract} 属性放在接口上的原因(它不是图中的构造型,它是一个属性——构造型使用 <>)。我不会自己做,因为不用说。