在UML类图中描述静态多态性

7
我有一个对象,在编译过程中根据构建配置进行实例化。就周围软件而言,该对象展现出相同的接口。我想要建模这样一个事实,即实例化决策是在编译期间做出的(即静态多态性),与通常的动态多态性相对应。是否有一种方法在UML类图中描述静态多态性?
以下是更多细节:
显然,上述类型定义中只有一个将在编译时实例化。

1
https://dev59.com/hW455IYBdhLWcg3wD_6Z - flup
接口方法的调用者在编译时是否知道要调用哪个具体子类实现?如果是,这是如何实现的? - flup
@flup - 不,他们不知道。否则多态的整个目的就会丧失。显式实现源自构建环境配置。 - SomeWittyUsername
如果我理解正确,调用者被编译以使用接口,并在运行时确定要调用的具体函数。因此,这是动态/子类型多态性。编译时发生的是依赖注入? - flup
@flup 不是的,具体的实现是根据预处理器标志在编译时决定的,这些标志因构建配置而异。两种实现的接口是相同的。 - SomeWittyUsername
5个回答

3

我认为静态和动态多态性的UML表示将是相同的。 UML关注的是类在运行时如何交互--我不认为有一种描述模板的UML格式,但我可能错了。


UML 不是关于类在运行时如何相互交互的。类图是描述不同实体之间静态关系的。其他 UML 图可以用来描述运行时行为。 - SomeWittyUsername
1
是的,我同意它在运行时描绘了静态关系。但我仍然认为没有办法区分静态/动态多态性。 - Chirag Desai
这就是动态多态和静态多态的区别 - 前者关注运行时的关系,而后者关注编译时的关系。 - SomeWittyUsername
@flup 很有趣,谢谢。然而,我的问题略有不同 - 我想在编译时选择不同的继承变体。 - SomeWittyUsername
@icepack 是的,我认为你的问题与UML模板关系不大。它们用于奇异递归模板模式,这是一种不同类型的静态多态性。发帖者复制了别人对另一个问题的回答的内容有点过多 :) - flup
显示剩余2条评论

2

我会使用刻板印象来解决问题。这样你就可以标记动态和静态。


1
但这会导致图表不太清晰。假设我在接口->派生类之间标记static。这自然意味着有两个static派生,而本意是只有一个(毕竟我们谈论的是多态性)。实际上,我只是在类图中的这两个派生之间添加了一个XOR符号。也许我会将其与您的建议结合起来,谢谢。 - SomeWittyUsername
你使用异或运算的想法听起来不错。 - user2004268

2
我认为你的图表很好。你描述的似乎最好用一个序列图来描述编译过程(就像你画工厂序列图一样)。
正如你正确指出的,运行时的交互发生在接口背后的某个未知的具体实现中,因此您在这些序列或交互图中永远不需要关心具体的类。那完全无关紧要。
如果有大量这种情况发生,那么部署图也可能是一个好主意,以帮助显示在什么情况下发生了哪些具体实现。
当然,您需要记录实现接口的类,并且这只是与您绘制的普通类图完全相同。

有趣的见解!从未想过编译的顺序图 - 有点不寻常,但为什么不呢?部署图也听起来是个好主意。谢谢,+1 - SomeWittyUsername

1

结合@ChiragDesai和@user2004268的答案以及链接问题(静态多态性定义和实现):

  1. 多态类型是一种实现细节,因此在设计图中没有积极作用。
  2. 实现细节可以出现在UML图中,但具有补充和非正式的角色。可以使用构造型和注释来澄清意图。

0
使用一个带有原型为Singleton的空类实用程序,其中包含一个名为例如#ifdef(YOUR_FLAG)的通用布尔参数,其true特化具有公共或实现可见性的实例作为静态成员。 编辑(回复评论)
在您的UML工具中绘制此内容:
伪C++代码:
class Foo; 

template <
   Boolean #ifdef(WHATEVER)
> struct Bar {};

template <> 
struct Bar<true> {
  public: 
    static Foo the_foo;
};

并添加utilitySingleton的模式(但是不要尝试从中生成代码 ;))


我不确定我理解了。您能添加一个示例图吗? - SomeWittyUsername
这是实现。我不是在问如何实现静态多态,而是如何在图表中描述它。实际上,我有类似于你代码片段的东西(尽管我没有看到你的示例中静态成员的含义 - 我不想限制具有特定专业化对象的数量,我想在编译时选择现有专业化之一)。 - SomeWittyUsername
不,那不是实现。这只是您在图表中可能绘制的文本描述。 - Solkar
这个问题有什么目的吗?模板概念与实现相关,而不是设计,因此应该从设计中派生,而不是相反。问题中没有暗示使用模板,可以通过#ifdef或构建配置实现类似的结果。 - SomeWittyUsername
你发了一些与问题无关的内容,现在你声称我试图从中挤出一些有用的东西是在浪费你的时间?这个回答最好被删除。我建议你开始对自己的行为负责。再见。 - SomeWittyUsername
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接