【发布时间】:2011-10-17 22:51:35
【问题描述】:
我有三个 Groovy 类:M、A 和 B。B 作为 M 的 mixin 和抽象类 A 的扩展存在:
class M {
def foo = 11
def bar = 12
}
abstract class A {
abstract foo
}
@Mixin(M)
class B extends A {
}
def b = new B()
print "${b.foo}\n"
print "${b.bar}\n"
尝试运行它会导致 Groovy 抱怨:
Can't have an abstract method in a non-abstract class. The class 'B' must be declared abstract or the method 'void setFoo(java.lang.Object)' must be implemented.
但是,该方法是由mixin M实现的。
此外,如果我将 B 更改为:
@Mixin(M)
class B extends A {
def foo = 13
}
然后我得到打印输出:
11
12
而不是:
13
12
这是我所期望的,并且似乎证明 M 提供了 A 的抽象方法的可接受实现。
那么,为什么 groovy 不喜欢使用 mixin M 来满足抽象类 A,我做错了什么?
【问题讨论】:
-
我不知道你被允许抽象属性...
-
据我所知,它是一个抽象的 getter 和 setter。不过我也没有,直到我的一位同事做到了。
-
我在the groovy mailing list 上问过,因为它看起来不正确(或确实有用);-)
-
@tim_yates 好的,但是删除它会破坏我们预先存在的代码,可能还会破坏其他代码。在我办公室做这件事的作者的意思是“我要访问一个名为 'foo' 的属性的 get 和 set 方法,我不在乎你如何定义它,但它需要在那里” .
标签: groovy abstract-class mixins