【问题标题】:Groovy :: @Mixin methods override target class methodsGroovy :: @Mixin 方法覆盖目标类方法
【发布时间】:2011-07-02 12:40:39
【问题描述】:
class A {  
  def test() { println "parent" }  
} 

@Mixin(A)  
class B {  
  def test() { println "child" }  
} 

new B().test() // prints "parent", but I am expecting it to print "child"

这看起来像是某种反向继承。

mixins 是否仅用作定义新方法的一种手段?

我当然可以使用传统继承并使用扩展,但用例需要一个表单构建器,其中每个域都有一个独特的表单实现,我想在我的应用程序控制器中捕获表单请求并执行 MyUniqueDomainForm .mixin DefaultFormMethods(所以我只需要在需要的时候定义默认方法,也不必在每个表单类中导入my.package.app.DefaultFormMethods)

【问题讨论】:

    标签: groovy mixins


    【解决方案1】:

    无论你mixin 会超载已经存在的任何东西......

    在这个例子中,在编译时B.test()重载了继承的A.test()方法

    但是在运行时,A.test() 是通过mixin 添加的,这会重新重载之前重载的方法

    如果不是这样,您将无法使用 mixins 更改类的现有特征

    ie(这是一个愚蠢的例子,但我相信它明白了我的意思):

    class AddNotMinus {
      static def minus( int a, int b ) {
         a + b
      }
    }
    
    Integer.mixin AddNotMinus
    println 10 - 10
    

    打印20

    【讨论】:

    • 谢谢蒂姆,我以为是这样。 Groovy “宣传” mixins 作为继承的替代方案,但没有提到隐含的 parent-overrides-child-method(据我所见)。因此,然后使用标准的 child 扩展 parent 以获得我假设的所需行为(即没有其他 @annotion 可以实现这一点?)
    • 没有问题。不是我知道的...除了添加A 类型的属性并将其标记为@Delegate :-/
    猜你喜欢
    • 2016-06-04
    • 2015-04-30
    • 1970-01-01
    • 2010-12-28
    • 2015-08-28
    • 2013-03-26
    • 2018-09-14
    • 1970-01-01
    • 2013-05-18
    相关资源
    最近更新 更多