我想使用 OCL 来链接两个在两个抽象级别上表示相同模型的类图。
为了说明这一点,考虑一个抽象模型 A,它包含一个类 Person,该类与其自身具有“父母”关联。还有一个更具体的模型 B,它具有 Person、Male 和 Female 类,其中 Male 和 Female 继承自 Person,以及两个关联,Person 和 Male 之间有一个“父亲”,Person 和女性之间有一个“Mother”。
我想使用 OCL 将两个模型链接在一起。也就是说,我想说具体模型中的“母亲”和“父亲”代表了抽象模型中的“父母”关联。
我知道可以将所有关联放在一个模型中,然后说类似
context Person inv:
self.mother->forAll(m | m in self.parents) and
self.father->forAll(f | f in self.parents) and
self.parents->forAll(p | p in self.mother or p in self.mother)
但我特别想分离模型。这个想法是具体模型不必明确地携带抽象。
我曾考虑使用包将每个模型放在单独的命名空间中,但据我所知,我最终得到了两个不同的 Person 类,每个包中都有一个。
有没有办法可以说不同包中的两个类名代表同一个类?那是同一组对象吗?例如,下面的表达式会实现这一点还是永远是假的?
Abstract::Person.allInstances() = Concrete::Person.allInstances()