【问题标题】:Depicting static polymorphism in a UML class diagram在 UML 类图中描述静态多态性
【发布时间】:2013-05-12 09:57:36
【问题描述】:

我有一个在编译期间根据构建配置实例化的对象。就所考虑的周围软件而言,该对象公开了相同的接口。我想模拟在编译期间做出实例化决定的事实(即static polymorphism),而不是通常的动态多态性。

有没有办法描述UML class diagram 中的静态多态性?

这或多或少是我需要的:

显然,只有上述类型定义之一将在编译时被实例化。

【问题讨论】:

  • 接口上的方法调用者在编译时是否知道要调用哪个显式子类实现?如果是这样,这是如何实现的?
  • @flup - 不,他们不知道。否则,多态性的全部目的就会丢失。显式实现源自构建环境配置。
  • 如果我没听错的话,调用者被编译为使用接口,调用的具体函数是在运行时确定的。所以它是动态/子类型多态性。编译时发生的是依赖注入?
  • @flup 不,具体的实现是在编译时根据每个构建配置不同的预处理器标志决定的。两种实现的接口是相同的。

标签: polymorphism uml class-diagram static-polymorphism


【解决方案1】:

我认为 UML 表示对于静态和动态多态是相同的。 UML 是关于类在运行时如何交互的——我不相信有用于描述模板的 UML 格式,但我可能错了。

【讨论】:

  • UML 不是关于类在运行时如何交互的。类图是关于不同实体之间的静态关系。其他 UML 图可用于描述运行时行为。
  • 是的,我同意它描述了运行时的静态关系。但我仍然认为没有办法区分静态/动态多态性。
  • 嗯,这就是动态多态和静态多态之间的区别——首先是关于运行时的关系,其次是关于编译时的关系。
  • 确实有一种UML方式来描述模板,类右上角的一个矩形,列出了模板类型。还有一种方法可以将模板绑定表示为一种特殊的继承。
【解决方案2】:

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

【讨论】:

  • 但这会导致图表不那么清晰。假设我在接口上标记 static --> 派生类连接。这自然意味着 2 个 static 派生,而意图是只拥有其中一个(毕竟我们在谈论多态性)。实际上,目前我只是在类图的两个派生之间添加了一个 XOR 表示法。也许我会把它和你的建议结合起来,谢谢。
  • 你的异或想法听起来不靠谱。
【解决方案3】:

我认为你的图表很好。您所描述的似乎最好描述为描述您的编译过程的序列图。 (有点像我猜你会如何绘制工厂序列图)

正如您正确指出的那样,运行时的交互发生在接口后面的一些未知的具体事物上,因此您永远不必真正关心这些序列或交互图中的具体类。在那里完全无关紧要。

如果这种情况很多,那么部署图也可能是一个好主意,可以帮助显示在什么情况下会发生什么具体实现。

您当然希望记录实现您的接口的类,这只是一个与您绘制的完全一样的普通类图。

【讨论】:

  • 有趣的见解!从来没有考虑过用于编译的序列图——有点不合常规,但为什么不呢?部署图听起来也是个好主意。谢谢,+1
【解决方案4】:

结合@ChiragDesai 和@user2004268 的答案和链接问题(Static polymorphism definition and implementation):

  1. 多态类型是一种实现细节,因此它在设计图中没有积极作用。
  2. 实现细节可以出现在 UML 图中,但具有补充和非正式的作用。刻板印象和注释可用于阐明意图。

【讨论】:

    【解决方案5】:

    使用具有构造型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 构造型(但不要尝试从中生成代码 ;))

    【讨论】:

    • 不确定我是否理解。你能添加一个示例图吗?
    • 我发现 UML 令人不安的一件事是,正确地绘制有趣的图表通常比编写代码需要更长的时间。请看我上面的编辑。
    • 这就是实现。我不是在问 如何 实现静态多态性,而是如何在图表中描述它。实际上,我有类似于您的 sn-p 的东西(尽管我在您的示例中没有看到静态成员的含义-我不想限制具有特定专业化的对象的数量,我想 选择 编译期间的现有特化之一)。
    • 不,这不是实现。这是您可以在图表中绘制的内容的文字说明。
    • 嗯,这正是问题所在。我知道如何描述我的意图并希望将 UML 用于设计目的而不是文本描述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多