Ссылка Ecore Eclasses.Можно ли ссылаться на eClasses из экземпляров xmi? - PullRequest
3 голосов
/ 06 декабря 2011

Можно ли ссылаться на eClass (мета-класс в ecore) из экземпляра (самой модели)?

Предположим, у меня есть мета-модель ecore M2.ecore, содержащая базовый класс BASECLASS, из которого происходят все мета-классы (eClasses). Это означает, что BASECLASS является суперклассом всех электронных классов метамодели M2.ecore. Один из этих классов, называемый M, использует BASECLASS, поэтому существует eReference между eClass M и BASECLASS:

M2.ecore

ClassA ----inherits_from------|> BASECLASS
ClassM ----inherits_from------|> BASECLASS
ClassM ----uses-(eReference)---> BASECLASS

Тогда у меня есть экземпляр INSTANCE_M eClass M, который я хочу связать с eClasses из M2.ecore, например:

M2.xmi

INSTANCE_M -----eReference---> (M2.ecore).Class_A

Это, я хочу связать классы метамодели. Очевидно, что с помощью Sample Reflective Editor я могу связывать только экземпляры, но не мета-классы.

Почему? Как решить эту проблему?

Заранее спасибо

1 Ответ

0 голосов
/ 30 декабря 2011

Прежде всего, я бы сказал, что ваша потребность идет (в некотором роде) против того, как работает EMF.В EMF у вас есть модель, определяющая некоторые понятия (назовем ее «метамоделью») и ее экземпляры (назовем эти «модели»).То, что вы хотите, это модель, которая будет содержать элементы модели и элементы метамодели.Понятия, которые могут появиться в вашей модели, должны быть определены в вашей метамодели, но метамодель - это просто обычная модель.В стандартном рабочем процессе EMF это просто экземпляр модели Ecore (мета), а Ecore также сам экземпляр модели EMF.Итак, у вас есть такая ситуация:

M2.xmi --instanceof -> M2.ecore --instanceof -> Ecore.ecore --instanceof -> Ecore.ecore ...

И вы хотите, чтобы в M2.xmi манипулировать экземплярами концептов, определенных в M2.ecore, и экземплярами концептов, определенными в Ecore.ecore (одним из таких экземпляров является ваша модель M2.ecore).

Вы можете создать себяМодель M2.ecore, содержащая ваши концепции, например, с атрибутом «myMetaEntity», ссылающимся на концепцию из Ecore.ecore.В редакторе ecore щелкните правой кнопкой мыши «загрузить ресурс», затем выберите «зарегистрированные пакеты» и выберите «http://www.eclipse.org/emf/2002/Ecore"» и «Ok». После «импорта» вы можете создавать ссылки на элементы из модели Ecore.ecore, например, выможет создать атрибут myMetaEntity с типом «EClass». Затем вы можете использовать его для ссылки на EClass из модели M2.ecore, но имейте в виду, что этот атрибут, определенный в M2.ecore, будет принимать любые экземпляры концепций «EClass», дажеиз M3.ecore или XYZ.ecore.

Если вы просто хотите ссылку из экземпляра на его метакласс, вы можете использовать метод "eClass ()", но если вы действительно хотите создать "сложные" ссылки между экземпляромэлементы и метаклассы, которые вы на самом деле не можете, но вы можете создать метамодель, импортирующую понятия из метаметамодели (я так ненавижу это название ...), здесь Ecore.ecore, чтобы получить возможность манипулировать обоими, но это такжеоткрывая своего рода «ящик Пандоры», потому что вы не можете сказать «вы можете манипулировать экземплярами концептов, определенных в Ecor»e.ecore, только если эти понятия взяты из M2.ecore ".

Если вы знаете, что делаете, или если ваши пользователи (или кто-то, кто не знаком с тонкостью этой проблемы), не манипулируют этим, потому что вы будетедайте им API / пользовательский интерфейс или что-то в этом роде, но ничего, но имейте в виду, что вы хотите сделать что-то сложное концептуально (но технически легко с EMF).

...