具有本机UML类型的模板类,以及模板类的OCL约束

时间:2013-11-22 21:11:32

标签: uml class-diagram ocl template-classes

我对同一个UML类图有两个问题。第一个是关于如何使用UML本机类型建模模板类。第二个是关于如何在OCL约束中处理模板类。

问题1:模板类

我想使用模板类来表示间隔,并使用UML标准来表示它。间隔必须可用于整数和浮点数。我到目前为止找到的最佳方法如下:

Best solution found so far

这里的想法是拥有一个模板类,参数TIntegerFloat类的超类。

我看到的问题是我需要重新定义UML的基本类型才能对它们进行分组。我想知道是否有一种干净的方法来定义模板类,并说T是类型integerfloat(在这里是UML的原语)。

问题2:模板类的OCL约束

我的问题的第二个方面是我希望能够添加OCL约束来说明我的间隔必须包含至少2个元素。问题是规则不能相同,具体取决于前一个类图中T的绑定。

对于花车:

context  Interval
inv :    self.supBound > self.infBound

对于整数:

context Interval
inv :   (self.infBoundIncluded and self.supBoundIncluded) implies supBound - infBound >= 1

context Interval
inv :   (not(self.infBoundIncluded) and self.supBoundIncluded) implies supBound - infBound >= 2

context Interval
inv :   (self.infBoundIncluded and not(self.supBoundIncluded)) implies supBound - infBound >= 2

context Interval
inv :   (not(self.infBoundIncluded) and not(self.supBoundIncluded)) implies supBound - infBound >= 3

所以我需要在OCL中找到一种方法来说某些规则仅在T绑定到Integer时适用,而其他规则仅限于Float。我不是OCL的专家,我找不到任何有用的信息,所以我要求一些帮助。

提前致谢,

巴斯蒂安。

1 个答案:

答案 0 :(得分:1)

经过更多研究后,我提出了以下解决方案:

问题1

解决方案是使用具有泛型类型的模板类(此类根据UML标准不可实例化),并将其与实现类绑定。相应的UML类图如下:

enter image description here

在这里,我们有两个可用的类IntegerIntervalRealInterval派生自一般模板类Interval,除了使用UML基本类型integer外,还保持简单和real

问题2

因为整数和实际区间之间的分离是在类级别完成的,所以OCL区别很简单。因此,约束条件如下:

context IntegerInterval
inv:    ...

context RealInterval
inv:    ...

无论如何,我仍然愿意接受其他建议:)