我对同一个UML类图有两个问题。第一个是关于如何使用UML本机类型建模模板类。第二个是关于如何在OCL约束中处理模板类。
问题1:模板类
我想使用模板类来表示间隔,并使用UML标准来表示它。间隔必须可用于整数和浮点数。我到目前为止找到的最佳方法如下:
这里的想法是拥有一个模板类,参数T
是Integer
和Float
类的超类。
我看到的问题是我需要重新定义UML的基本类型才能对它们进行分组。我想知道是否有一种干净的方法来定义模板类,并说T
是类型integer
或float
(在这里是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的专家,我找不到任何有用的信息,所以我要求一些帮助。
提前致谢,
巴斯蒂安。
答案 0 :(得分:1)
经过更多研究后,我提出了以下解决方案:
问题1
解决方案是使用具有泛型类型的模板类(此类根据UML标准不可实例化),并将其与实现类绑定。相应的UML类图如下:
在这里,我们有两个可用的类IntegerInterval
和RealInterval
派生自一般模板类Interval
,除了使用UML基本类型integer
外,还保持简单和real
。
问题2
因为整数和实际区间之间的分离是在类级别完成的,所以OCL区别很简单。因此,约束条件如下:
context IntegerInterval
inv: ...
context RealInterval
inv: ...
无论如何,我仍然愿意接受其他建议:)