Я хотел бы использовать OCL для связывания двух диаграмм классов, которые представляют одну и ту же модель на двух уровнях абстракции.Можно ли использовать один и тот же класс в разных пакетах OCL?
Чтобы проиллюстрировать, рассмотрим абстрактную модель A, которая содержит класс Person, у которого есть ассоциация родителей. И более конкретная модель B, в которой есть классы Person, Male и Female, с мужчинами и женщинами, наследующими от Личности, и две ассоциации, один «отец» между Лицом и Маме и одна «мать» между Лицом и Женщиной.
Я хотел бы использовать 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()
Привет Хавьер, спасибо за подробный ответ. Я думаю, что ваш подход «слияния» подходит ближе всего к тому, что я хочу, но я не думаю, что подход 'oclIsKindOf' будет работать, потому что согласно стандарту OCL 2.4: _ Свойство 'oclIsKindOf' определяет, является ли' t' либо прямой тип, либо один из супертипов объекта. Другими словами, это предикат, поэтому его использование в инварианте будет просто сделать инвариантом ложным. –
, если 'Concrete :: Person' не является * прямым типом или одним из супертипов * экземпляра' Abstract :: Person', то инвариант ложный ... но мы уже говорили, что ** каждый ** экземпляр of 'Abstract :: Person' также является« Concrete :: Person »(потому что это та же концепция), тогда инвариант всегда верен; и это необходимо для того, чтобы требовать согласования модели. – Javier
Но как мы сказали, что каждый экземпляр «Abstract :: Person» также является «Concrete :: Person»? было сказано с выражением OCL? или мы просто сказали, что вне формальной структуры? –