假设您有一个更大的汽车简介的摘录:

现在,我想为一辆汽车定义一些约束,比如其中一个约束,如果attrA是true,那么attrB必须是false,使用OCL:
Context UML::Core::Class inv:
self
.stereotype
.name='Car'
implies
self.attrA=true
implies
self.attrB=false我的问题是:如果Mercedes原型专门用于汽车原型,那么我是否坚持同样的约束,换句话说:刻板印象Car是否仍然应用于具有Mercedes原型的类?
如果应用的原型是self.stereotype.name='Car',则false将返回Mercedes。
这是有趣的,因为我想拥有相同的属性在奔驰和汽车,但我想改变先前声明的约束。
发布于 2020-11-03 18:34:49
如果应用的原型是梅赛德斯,那么
,我会假设
是的你是对的。
梅赛德斯继承了约束,所以self.stereotype.name='Car'是错误的,因为“奔驰”和“汽车”是两个不同的字符串。
如果您想让第一个暗示活动的元类专门性Car直接或间接,您可以得到所有的概括原型本身搜索一个名为“Car”,也检查的概要文件的名称,并可能是它的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'))补充说明:
在您的建议中,
Cars=“Car”和
图中的
< (可能使用PlantUML) :

发布于 2020-11-03 19:41:04
如果你想一想,你的要求是不合理的。
假设您的系统已经有了过度热情的限制,即汽车的FuelType是汽油。你很难定义一辆FuelType是柴油的衍生汽车;它不是汽车的wrt,而是汽车的模型定义。
你可以试着用混合器来解决这个问题,但是对于任何实际生产的汽车来说,排列的数量都是无法忍受的。
相反,您可以采用Namespace.isDistinguishable规范所采用的漏洞的方法,比如确定是否需要惟一的名称(允许多个未命名的约束)。
因此,对于Car,您可以定义可以重写的getAcceptableFuelTypes()助手,以便为派生类创建一个漏洞;将基本约束实现为getAcceptableFuelTypes()->includes(fuelType)。
https://stackoverflow.com/questions/64661857
复制相似问题