【发布时间】:2015-06-07 10:45:41
【问题描述】:
我对 UML 很陌生,所以我对泛化和实现有一些疑问。我正在对电子微控制器的行为进行建模,我需要根据 UML 描述生成 C++ 代码。
据我所知,一个类 实现一个接口,也就是说它可以提供一个接口的实现。 两个类之间可能存在泛化关系。在这种情况下,派生类继承基类的所有成员并获得对公共和受保护成员的访问权。
这是我的问题(我使用 Visual Paradigm 作为建模工具)。
假设我们有一个微控制器模块,即Timer。我们有一组可以执行的操作,比如initTimer()、startTimer()、stopTimer() 等等。实际上这些函数定义了一种API。我们可能有不同类的Timer,比如TimerA、TimerB、TimerC,它们继承(或实现?)所有引用的操作。图片可能会使场景更清晰。 [C] 表示分类器。
+----------------------------------+
| <<SW>> |
| <<Singleton>> |
+--------------| TimerA |
| +----------------------------------+
| | -instance : TimerA* = null [C] |
| | -instanceFlag : bool = false [C] |
| | -moduleAddress const = 0x0010 |
| +----------------------------------+
| | -TimerA() |
V | +getInstance() : TimerA* [C] |
+---------------+ +----------------------------------+
| <<SW>> |
| Timer |
+---------------+
| +initTimer() |
| +startTimer() |<-----------------------+
| +stopTimer() | |
+---------------+ +----------------------------------+
| <<SW>> |
| <<Singleton>> |
| TimerB |
+----------------------------------+
| -instance : TimerB* = null [C] |
| -instanceFlag : bool = false [C] |
| -moduleAddress const = 0x0020 |
+----------------------------------+
| -TimerB() |
| +getInstance() : TimerB* [C] |
+----------------------------------+
Visual Paradigm 允许用户将代码放入每个函数中。我问你箭头应该是哪种关系。
1) 泛化:Timer 具有一组操作的类。每个操作都有其代码实现。两个派生类TimerA 和TimerB 具有继承类Timer 的操作的泛化链接。
2) 实现:Timer是一个接口(不是图中所示的类)和两个实现类TimerA和TimerB。关键点如下。虽然 Timer 是一个接口,它的操作不应该包含实现细节,但 VP 允许为这三个操作编写实现代码。在代码生成期间,会创建一个接口 C++ 类 Timer:initTimer()、startTimer() 和 stopTimer() 是 Timer 的虚拟成员,无代码(应该是这样)。生成了一个 C++ 类TimerA,它继承了类Timer 的成员;另外Timer的三个操作在TimerA的成员之间复制了我为接口类的操作编写的代码实现。 TimerB 也会发生这种情况。
您认为这两种描述中哪一种更好?即使我知道在代码生成后会转移到实现类中,为接口的操作编写代码实现是否正确?
【问题讨论】:
标签: class uml code-generation visual-paradigm generalization