0

我必须类、Container 和 Containable,并且我想实现限定名称( root/containerA/containerB/containableXYZ )

因此,Container 派生自 Containable 并且 Containable 有一个 fullName 属性,我将其设置为派生、瞬态和易失性,它可以工作

return (parent != null) ? parent.getName() + SEPARATOR + getName() : getName();

但是现在我担心在层次结构的每个级别的大型模型中,都会不必要地计算相同的路径 - 每个容器都可以缓存它的路径

但是,如果容器的父级发生更改 - 我如何自动重新计算它的路径?

4

1 回答 1

1

EMF中,对象包含在具有树层次结构的资源中。您可以做的是扩展资源以在对象从树中附加或分离时进行拦截。

请参阅:ResourceImpl.attached()

您可以做的其他事情是在您的类中覆盖方法eBasicSetContainer() 。最好的办法是为所有模型类提供一个抽象的公共根类。那么你可以做的就是在新的容器对象不为空时拦截这个方法并更新路径。

在这两种情况下(拦截 Resource 或 EObject),请确保您还重新计算了被更改元素的子树中任何包含元素的路径。这可以通过使用以下方法重新计算递归迭代子树的路径来轻松完成:EcoreUtil.getAllProperContents(EObject)

顺便说一句,您还可以使用EcoreUtil.getIdentification(),它使用其 URI 返回元素的限定名称。

于 2015-04-05T09:12:10.083 回答