Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629574
  • 博文数量: 155
  • 博客积分: 5688
  • 博客等级: 大校
  • 技术积分: 2134
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-15 15:12
文章分类

全部博文(155)

文章存档

2011年(58)

2010年(97)

分类: Java

2011-02-08 19:15:56

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
提示本文是关于介绍EMF,即Eclipse modeling Framework
 
下面介绍EClass与EReference的关系。简单的理解就是类之间关系。
 

 

前面基本都讲解过了,所以只是简单说明说明。

一个EReference通过eReferenceType来描述类型,它的类型是一个EClass。而他的超类ETypedElement通过eType来指定类型。

所以eType这时可以向下转换为Eclass

eReferences      是一个Eclass的所有包含类的关系的集合(EList),但不包含超类的。

eAllReferences是所有的包含类的关系的集合(EList),即包含Eclass自己的,也包含超类的。

eContainments是聚合关系中,所有的被聚合的关系的集合。所谓聚合就是被包含的类的生命周期是跟随聚合对象的。

eOpposite,         是在双向关联中,EClass在对方中的包含关系。双向的当然需要两个EReference来描述了。

eOpposite是指对方的,很容易理解的。

而属性里containment是指是否被聚合了,container正好是说一个类是否聚合了其他的类了。

ResolveProxies属性则指这个EReference是否被代理了。是跟序列化和反序列化相关的。

EClass里对应的方法如下

EList getEReferences()

EList getEAllReferences()

EList getEAllContainments()

TMD  getEALLAttributes()是一样的。ctrl+C ctrl+V简单完成的代码。

  1. public EList<EReference> getEAllReferences() {
  2.     if (eAllReferences == null) {
  3.       class ReferenceList extends UniqueEList<EReference> {
  4.         private static final long serialVersionUID = 1L;
  5.         public ReferenceList() {
  6.           super();
  7.         }
  8.         @Override
  9.         protected Object [] newData(int capacity) {
  10.           return new EReference [capacity];
  11.         }
  12.         @Override
  13.         protected boolean useEquals() {
  14.           return false;
  15.         }
  16.       }
  17.       BasicEList<EReference> result = new ReferenceList();
  18.       BasicEList<EReference> references = new ReferenceList();
  19.       Set<EClass> computationInProgress = COMPUTATION_IN_PROGRESS.get();
  20.       if (computationInProgress.add(this)) {
  21.         for (EClass eSuperType : getESuperTypes()) {
  22.           result.addAll(eSuperType.getEAllReferences());
  23.         }
  24.         computationInProgress.remove(this);
  25.       }
  26.       for (EStructuralFeature eStructuralFeature : getEStructuralFeatures()) {
  27.         if (eStructuralFeature instanceof EReference) {
  28.           references.add((EReference)eStructuralFeature);
  29.         }
  30.       }
  31.       references.shrink();
  32.       eReferences = new EcoreEList.UnmodifiableEList.FastCompare<EReference>
  33.           (this, EcorePackage.eINSTANCE.getEClass_EReferences(), references.size(), references.data()) {
  34.           private static final long serialVersionUID = 1L;
  35.           @SuppressWarnings("unchecked")
  36.           @Override
  37.           public void addUnique(EReference object) {
  38.             ((InternalEList<EReference>)(InternalEList<?>)getEStructuralFeatures()).addUnique(object);
  39.           }
  40.           @Override
  41.           public boolean add(EReference object) {
  42.             System.err.println("Please fix your code to add using EClass.getEStructuralFeatures() instead of EClass.getEReferences()");
  43.             return getEStructuralFeatures().add(object);
  44.           }
  45.         };
  46.       result.addAll(eReferences);
  47.       result.shrink();
  48.       eAllReferences = new EcoreEList.UnmodifiableEList.FastCompare<EReference>
  49.           (this, EcorePackage.eINSTANCE.getEClass_EAllReferences(), result.size(), result.data());
  50.       getESuperAdapter().setAllReferencesCollectionModified(false);
  51.     }
  52.     return eAllReferences;
  53.   }

EReference类里取得eOpposite的方法是:

EReference getEOpposite()

取得eReferenceType的方法是:

EClass getEReferenceType()

阅读(1534) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~