2016-09-06 35 views
-1

我想檢索Ecore類的遏制。所以,我有例如像這樣的結構:檢索Ecore類的遏制

class SuperClass{ 
    protected EObject superClassProperty; 
} 

class SubClass extends SuperClass{ 
    private EObject subClassProperty; 
} 

現在我想子類(subClassProperty)的所有安全殼。 我不喜歡這樣寫道:

EList<EReference> _eAllContainments = eClass.getEAllContainments(); 

但如果我這樣做,我也得到了超(superClassProperty)繼承的安全殼。我怎麼才能檢索給定的類(只是subClassProperty)中包含的那些?

+0

這個問題出了什麼問題?一些反饋意見會適當地以適當的方式提出。 – landunder

+0

我認爲你需要更多的解釋你面臨的問題。 ;) –

回答

1

如果你指的Ecore的,我假設你正在使用EObject元素。 每個EObject實施.eContents().eAllContents()方法。

它們之間的區別是:

.eContents()爲您提供了所有直接遏制功能List<EObject>這就是所謂的類(在元類中定義與遏制=真正的所有功能)。 雖然eAllContents()爲您提供了所有的控制功能的一個TreeIterator<EObject>與你的等級爲根樹

左右(基本上它的所有直接eContents()裹成一個迭代器的返回.eContents()),如果你只想要直接包含的值功能然後只需使用eClass.eContents()

因爲它並不完全清楚,我你想達到什麼:

EList<EReference> = _eAllContainments = eClass.getEAllContainments ();

我會告訴你一些使用emf來獲得你想要的對象的方法。

假設你有一個你的元類的實現對象(你應該知道實現和元類之間的區別,元類是你正在建模的EClass,實現是,是這個的實現EClass,但EClass是一個完全獨立的對象),然後通過調用.eClass()來獲得對象的meta-EClass。

每個EClass關於其宣佈EReferenceEAttribute,您可以通過調用如讓他們的信息:.getE[All]References(),在.getAll...也返回你EClass的定義超類中的所有元素。

因此,現在您知道如何獲得您定義的元對象,但是如何在實現對象中獲得表示它們的實際值?

答案是「反思」。 EMF使用所謂的反射性吸氣劑(.eGet)和制定者(.eSet),它們採用EStructuralFeature並返回實際值。

因爲每個EAttributeEReferenceEStructuralFeature你得到的連接從您的EClass信息反饋給你實現。

FYI:你也可以得到你的EClass的名字的EStructuralFeatures,那麼你可以做這樣的事情: 認爲你的元素有被稱爲name那麼屬性:

element.eGet(element.eClass().getEStructuralFeature("name")); 

給你的實際值爲你的元素的屬性。

+0

這使事情更清晰。爲了得到遏制,我使用'.getERefernces()',然後檢查'isContainment()' – landunder

0

我想你還沒有instatiatet像超:

List<Superclass> list = new ArrayList<>(); 
    list.add(new Superclass()); 

所以沒有子類的實例。你真的用正確的方法和正確的參數數量和類型嗎?

子類是否有一個存儲元素的字段?

+0

不,代碼中沒有錯誤。我有一個給定的Ecore模型,其中已經設置了結構。 – landunder

+0

你從哪裏得到eClass。你確定你有一個子類的實例嗎? _getEAllContainments()_方法的作用是什麼?這是一個簡單的getter? – finder2

+0

我正在使用現有的Ecore模型。該方法是EMF的一部分。是的,它是一個簡單的getter,並且按名稱的名稱來做。 – landunder

0

如果那些是從子或父if語句檢查以下內容:

eClass.getEAllContainments().get(i).EContainingClass.name == eClass.name