【问题标题】:Can Groovy Mixins Satisfying Abstract Class Requirements?Groovy Mixins 能否满足抽象类的要求?
【发布时间】: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


【解决方案1】:

你没有做错任何事。这是编译器在实际应用 AST 转换之前执行此检查的问题。您最好将其发布到他们的问题跟踪器http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242

由于@Mixin 转换实际上是由 Groovy++ AFAIK 的作者创建的,并且由于 Groovy++ 对类别、mixin 和特征有更多的扩展支持,因此您可以期望这是一个有效的代码。你应该试试看。

【讨论】:

  • 谢谢,我买了票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 2014-08-26
  • 2017-03-16
相关资源
最近更新 更多