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} 属性放在接口上的原因(它不是图中的构造型,它是一个属性——构造型使用 <>)。我不会自己做,因为不用说。
我目前正在从现有的 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
c) 是的。接口是抽象的,如果您查看“详细信息”选项卡,您会看到 Abstract
框已勾选且无法更改。我不知道大括号中的文字是从哪里来的。这不是刻板印象。我可以像那样显示它的唯一方法是将类型从 int
更改为 int {abstract}
.
d) 您可以在 class 中实现多个接口,因此理论上所有连接器都可以。所以Derived
实现了两个接口。
编辑 正如@minastros 自己发现的(并私信我),罪魁祸首是 EA 选项中的无数标志之一:
正如 Thomas 所提到的,从技术上讲,接口 是 抽象 class,尽管抽象 class 并不总是接口。如果您有一个操作(方法)未实现,class 是抽象的,因此如果实现了 none 个操作,则 class 也是抽象的。 "abstract class" 通常只被认为是具有部分实现的 class,因为这样的抽象 class 与接口不同。但是,没有实现的 class——一个接口——技术上也是一个抽象 class。
这可能就是 EA 将 {abstract} 属性放在接口上的原因(它不是图中的构造型,它是一个属性——构造型使用 <>)。我不会自己做,因为不用说。