2
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"

これはある種の逆継承のように見えます。

ミックスインは、新しいメソッドを定義する手段としてのみ使用されますか?

もちろん、従来の継承を使用して拡張を使用することもできますが、このユースケースでは、各ドメインに固有のフォーム実装があり、アプリケーションコントローラーでフォームリクエストをキャッチしてMyUniqueDomainForm.mixinDefaultFormMethodsを実行するフォームビルダーが必要です。 (したがって、必要な場合にのみデフォルトのメソッドを定義する必要があり、各フォームクラスにmy.package.app.DefaultFormMethodsをインポートする必要はありません)

4

1 に答える 1

2

mixinすでにそこにあるものは何でもオーバーロードします...

この例では、コンパイル時B.test()に継承されたA.test()メソッドをオーバーロードします

ただし、実行時に、以前にオーバーロードされたメソッドを再オーバーロードするをA.test()介して追加されますmixin

この方法でなかった場合、を使用してクラスの既存の特性を変更することはできません。mixins

すなわち(これはばかげた例ですが、私はそれが私の主張を理解していると信じています):

class AddNotMinus {
  static def minus( int a, int b ) {
     a + b
  }
}

Integer.mixin AddNotMinus
println 10 - 10

プリント20

于 2011-02-23T08:32:09.037 に答える