2013-06-27 3 views
3

상속에 관해서 ecore 기반 모델에서 전체 속성을 재정의하거나 다시 정의 할 수 없다는 사실을 알고 있습니다. 하지만 기존의 상속 된 속성에 새 값을 할당 할 수 있습니까?파생 Ecore 클래스 (EMF)의 속성 값을 재정의

예. 클래스 A는 이름이 인 문자열을 정의하며, 기본값은 'defaultA'로 설정됩니다. 클래스 B는 클래스 A에서 상속 받고 이름은이어야하며 'defaultB'여야합니다.

클래스 B에서 동일한 이름과 데이터 유형으로 특성을 다시 구현하려고했지만 그로부터 genmodel을 만들 수 없습니다 ("이름 '이라는 두 가지 기능이 없을 수 있음).

상속 된 속성의 값을 변경할 수도 있습니까?

+0

사물의 이러한 종류의 생성 된 코드에 달성 될 수있다. 나는 이것을 모델에서 직접 수행하는 방법을 알지 못한다. (당신이 원한다고 가정 할 때?) – sxc731

답변

2

아니요, 지원되지 않습니다. 지형지 물에 대한 필드는 기본 클래스에서 선언되며 지형지 물에 정의 된 기본값을 할당합니다 ...

3

속성은 일반 EMF에서는 재정의 할 수 없지만 OCL을 통해 해결 방법이 있습니다. (물론 자바 코드를 생성하고 필요에 따라 속성을 구현할 수 있지만 메타 모델을 만든 Eclipse 인스턴스에서는 작동하지 않습니다.)

트릭은 EMF에서 작업을 재정의 할 수 있다는 것입니다. 및 OCL을 통해 필요에 따라 작업을 구현할 수 있습니다.

다음은 클래스 AB으로 구성된 메타 모델을 정의하는 최소 예 (OCLinEcore 편집기로 작성)입니다. A 클래스에는 label이라는 속성이 있으며 이는 computeLabel() 작업으로 리디렉션됩니다. 클래스 'B'는 computeLabel() 작업에 대해 다른 구현을 제공합니다.

package workaround : workaround = 'workaround' { 
    class A { 
     operation computeLabel() : String { 
      body: 'labelA'; 
     } 
     attribute label : String { 
      derivation: computeLabel(); 
     } 
    } 
    class B extends A { 
     operation computeLabel() : String { 
      body: 'labelB'; 
     } 
    } 
} 

당신은 클래스 B의 동적 인스턴스를 생성 표준 Sample Reflective Ecore Model EditorB.xmi 파일을 열어 그것을 테스트 할 수 있습니다. 그런 다음 볼 수 있습니다 :

enter image description here

0

이 오히려 hackish 대안이 에이 기능 게터 이름과 같은 이름의 하위 클래스에서 작업을 선언합니다.

이것은 Viliam Simko 솔루션의 경량 변형입니다.

이 솔루션을 사용하면 클래스 B에 적절한 name 기능이 없지만 클래스 012의 name 기능에 액세스하면 클래스 B의 getter가 대신 호출됩니다.

나는 이것이 실제로 허용되는지 모른다. 하지만 그것은 EMF 2.13.0, Xcore 1.5.0에서 작동하는 것으로 보입니다.

예 :

내 경험에
class ClassA { 
    String name 
} 

class ClassB extends ClassA { 
    op String getName() { 
     return "Name B" 
    } 
}