Class UML的推广与实现

Class UML的推广与实现,class,uml,code-generation,visual-paradigm,generalization,Class,Uml,Code Generation,Visual Paradigm,Generalization,我对UML非常陌生,所以我对泛化和实现有一些疑问。我正在建模一个电子微控制器的行为,我需要从UML描述中生成C++代码。 据我所知,类实现了接口,这意味着它可以提供接口的实现。 两个类之间可能存在泛化关系。在这种情况下,派生类继承基类的所有成员,并获得对公共成员和受保护成员的访问权 这是我的问题(我使用可视化范例作为建模工具)。 假设我们有一个微控制器模块,即定时器。我们可以执行一组操作,比如initTimer(),startTimer(),stopTimer()等等。实际上,这些函数定义了一种

我对UML非常陌生,所以我对泛化和实现有一些疑问。我正在建模一个电子微控制器的行为,我需要从UML描述中生成C++代码。 据我所知,类实现了接口,这意味着它可以提供接口的实现。 两个类之间可能存在泛化关系。在这种情况下,派生类继承基类的所有成员,并获得对公共成员和受保护成员的访问权

这是我的问题(我使用可视化范例作为建模工具)。 假设我们有一个微控制器模块,即
定时器
。我们可以执行一组操作,比如
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]     |
                       +----------------------------------+
+--------------------------------------+
|                            |
|                     |
+--------------|蒂梅拉|
|              +----------------------------------+
||-实例:TimerA*=null[C]|
||-instanceFlag:bool=false[C]|
||-moduleAddress常量=0x0010|
|              +----------------------------------+
||-TimerA()|
V |+getInstance():TimerA*[C]|
+---------------+       +----------------------------------+
|         |       
|计时器|
+---------------+
|+initTimer()

|+startTimer()|可能这只是VP的简写,让事情变得更快。正如您所说,在生成代码时,它会从接口中清除这些代码,并将其放入实现类中。我不认为这有什么错,因为重要的是生成的代码,在您的情况下,这是正确的

你认为这两种描述哪一种更好

在我看来,下图所示的选项3更好
Timer
将是可重用的(概念上为
final
)通用类,它的实例仅由单例包装器配置,并由

VP允许为这三个操作编写实现代码。在代码生成期间…为接口的操作编写代码实现是否正确

我不知道如何正确配置VisualParadigm的代码生成器来生成您想要的内容,但是尽管
C++
接口是,并且这个概念没有特殊的
关键字
,它只是对
契约的描述,没有耦合的实现。有些语言喜欢或有专门的
接口
关键字
,在编译器中没有硬编码的代码规则

因此,尽管可视化范例最终可能会生成您想要的代码,但从
UML
的角度来看,用代码建模
接口是错误的


做出你的选择。如果你想要的只是能做一些事情的代码,那就去破解它吧(正如@gilead silvanas所建议的)。如果你想练习
UML
,以便在将来的项目中使用不同的语言,那么就不要这样做

还有一段时间,初始生成的代码将与初始设计图纸和代码生成器分离,您将手动编辑它,即使您使用类似的工具


我(经常)会重新考虑,如果与设计工具的斗争过重,代码生成的好处将是什么

谢谢你的回答。我最初的看法是,
Timer
实际上代表一个接口,因为它包含一组方法(API),每个特定模块(
TimerA
TimerB
,等等)都必须实现这些方法。从UML的角度来看,我对概念上最可接受的解决方案持怀疑态度。另一个值得警惕的地方是写下C++代码(VP),因此实现了接口的一部分,而不是一个类。在我看来,在UML透视图中,如果我们要严格遵循面向对象的规则,在接口中写实现是不正确的。如果我错了请纠正我。通过建模,可以确保类
TimerA
TimerB
的单一存在,因为相应的标志由两个单一包装器中的任何一个设置。实际实例化的是一个类为
Timer
的对象,用于提供尽可能多的单例包装器(这是通过
TimerA::getInstance()
TimerB::getInstance()
静态成员实现的)。那么,最后,构造函数
TimerA()
TimerB()
是未使用的吗?我可以从
TimerA
TimerB
Timer
类传递参数吗。我特别指的是
模块服装
。谢谢你。是的,这就是我的意思,
TimerA()
TimerB()
可能有类“静态”构造函数,它们将初始化
实例
变量。但是不要像对待
C 35;
那样直截了当地认为计时器的滴答声将由连接到。我已经有好几年没有活跃在
C++
世界了(我很高兴)。在
C++
中,您可能必须通过创建子类来实现它。因此,在代码生成方面,我的回答可能会有很大的误导性