问题描述
现在,我想为汽车定义一些约束,例如约束条件之一,如果attrA
是true
,那么attrB
必须是false
使用OCL:
Context UML::Core::Class inv:
self
.stereotype
.name='Car'
implies
self.attrA=true
implies
self.attrB=false
我的问题是:如果Mercedes
构造型专门用于汽车构造型,我是否要遵循相同的约束条件,换句话说:构造型Car
是否仍适用于具有{{1} }使用定型观念?
如果应用的构造型为Mercedes
,我想self.stereotype.name='Car'
返回false
。
这很有趣,因为我想在梅赛德斯上拥有与在汽车上相同的属性,但是我想更改先前说明的约束。
解决方法
如果应用的原型是梅赛德斯,我假设self.stereotype.name ='Car'返回false。
是的,对。
Mercedes 照原样继承了约束,所以对于{E1)刻板的 Mercedes 而不是 Car 的类,self.stereotype.name='Car'
为false,因为'梅赛德斯”和“汽车”是两个不同的字符串。
如果您希望直接或间接地使专门针对 Car 的元类的第一个 implies 有效,则可以获取更多的构造型本身的概括,以搜索一个命名的“汽车”,还会检查构造型的配置文件的名称,并且可以是其URI。例如,将self.stereotype.name='Car'
替换为:
self.stereotype.profile.name = 'Cars' and
-- self.stereotype.profile.URI= '...' and
self.stereotype.generalization()
->closure(general.generalization).general()
->including(self.stereotype)
->select(name = 'Car')
->notEmpty()
或具有名为 Cars 的单独配置文件,并且具有名为 Car 的单独原型:
self.stereotype.oclIsKindOf(Profile.allInstances()
->any(name = 'Cars') -- may be check also URI
.ownedStereotype->any(name = 'Car'))
其他说明:
-
在您的提案中,您假设所有配置文件的所有构造型中只有构造型名为 Car ,当然可以是错误的。您还可以检查配置文件的名称,并且可以是其URI,例如:
self.stereotype.name='Car' and self.stereotype.profile.name='Cars' -- and self.stereotype.profile.URI= '...'
-
在图中的箭头是错误的,因为它必须是实心三角形而不是
<
(可能使用PlantUML):
考虑一下,您的要求是不合理的。
假设您的系统已经过度热情地限制了Car的FuelType为PETROL。您很难定义燃料类型为DIESEL的派生汽车;不会是汽车的建模定义的汽车。
您可以尝试解决使用mixins的问题,但是对于任何实际生产的Car,排列的数量都是无法忍受的。
相反,您可以采用UML规范采用的漏洞方法,以Namespace.isDistinguable helper为例,它确定是否需要唯一名称(允许使用多个未命名约束)。
因此,对于Car,您可以定义getAcceptableFuelTypes()帮助器,该帮助器可以被重写以为派生类创建漏洞;将基本约束实现为getAcceptableFuelTypes()-> includes(fuelType)。