在EMF Ecore模型中,枚举是否可以实现一个接口?

5
在EMF Ecore模型中使用枚举实现一个接口是否可行?在Java中可能有这样的代码:public enum MyEnum implements MyInterface。我希望通过EMF生成类似的代码(顺便说一句,默认情况下,所有由EMF生成的枚举都实现了org.eclipse.emf.common.util.Enumerator)。但我找不到让生成的枚举实现特定接口的方法。在ecore图形编辑器或ecore模型编辑器中都无法定义枚举的继承关系。我可以在生成代码后手动添加implements部分,但每次重新生成代码时它都会被覆盖。另外,是否有办法让EMF的代码生成器不覆盖implements(只是它)?我知道可以修改类javadoc注释中的@generated标签为@generatedNOT,这样代码生成器就知道不要覆盖该类了,但这样做会阻止我在修改模型时更新该类。现在,我每次修改这个枚举时都会手动添加implements,并保持其余时间的@generatedNOT标签。但我感觉过一段时间我就会忘记,并且如果有人尝试修改它,即使已经正确地记录了,也可能会变得危险。与此有关的一些问题请参见:EMF Eclipse:带自定义字段(属性)的枚举
1个回答

0

枚举由EEnum的实例表示。接口由值为trueInterface设置的EClass的实例表示。

然后可以在getEAllSuperTypes()中使用EClass的接口。

请注意,EEnumEClassEModelElement的不同子接口,因此除了在EModelElement中公开的成员之外,它们不共享任何成员。
这是因为Java在处理枚举时很特殊,将其实现为特殊类。 EMF旨在允许更“常见”的枚举理解,其中它们不能公开接口。

因此,在EMF中不可能让枚举实现接口。
当您向枚举添加接口时,唯一的选择是手动完成,绕过所有代码生成,因为EMF不支持该特定行为。您可能要考虑的另一种选择是拥有一个或多个静态实用程序方法,通过“柯里化”提供该接口,从而转换此内容:

interface Foo {
    void bar();
    Baz baz(Quux quux);
}
enum Gen implements Foo { ... }

转换为:

class GenFoo {
    static void bar(Foo foo);
    static Baz baz(Foo foo, Quux quux);
}

这个想法基本上就是C#实现的“扩展方法”,但是他们有语言支持,而Java没有 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接