C++ Link Seam 的 UML 符号(与不同的实现共享 header)

UML notation for C++ Link Seam (shared header with different implementation)

在 C++ cross-platform 库中,
我们使用共享的headers,每个OS.
使用不同的模块版本编译 A.k.aLink-Seam

//Example:
//CommonHeader.h
#ifndef COMMON_HEADER_H
#define COMMON_HEADER_H
class MyClass {
public:
  void foo();
}
#endif

.

//WindowsModule.cpp
#include "CommonHeader.h"
void MyClass::foo() {
  //DO SOME WINDOWS API STUFF
  printf("This implements the Windows version\n");
}

.

//LinuxModule.cpp
#include "CommonHeader.h"
void MyClass::foo() {
  //DO SOME LINUX SPECIFIC STUFF HERE
  printf("This implements the Linux version\n");
}

当然,在每个构建中,您只能 select 一个模块,具体取决于您使用的环境。

这是为了抑制对函数的间接调用

我的问题是:如何在 UML 中标注这种关系?

"Inheritance"? "Dependency"? "Note"?

可以看作是某种"inheritance"。然而 classes 之间没有关系,因为只有一个 class - 所以两者之间没有关系。然而,使用平台相关实现的实际构造模仿关系 "is a".

class MyClass {
public:
  void foo();
}

这只不过是一个 class 合同,所以基本上是您在不同模块中 实现 的一个接口。要将其可视化,您可以使用 接口实现 表示法(类似于概括,但带有虚线)。

现实情况是,我认为您在 UML class 图中只有一个 class,即 MyClass,具有 public 操作 foo( );只是你有这个 class 的两个代码实现,一个用于 Linux,一个用于 Windows。 UML Class 模型并没有真正设置来回答你如何实现这个的问题,在你使用带有头文件的 c++ 的情况下:想象一下,如果你内联你的函数并最终编写 My[= 的两个内联实现17=],一个用于 Linux,一个用于 Windows。从逻辑上讲,您的 class 图中仍然有一个 class (但有两个实现)并且头文件(或缺少头文件)不会进入其中。因此,您需要的是一种展示 C++ 结构的方式,而不是展示逻辑 class 构造的方式。我不知道 UML 中表示代码结构的特定方法,但是您可以使用 Artefacts 构建代码结构模型(?),它可以表示 c++ 文件结构。