メソッドにメソッドを追加すると、メタクラスはそれをインタフェース実装のすべてのインスタンスに追加します。すべての実装クラスにメソッドを追加すると、毎回変更が発生します。インタフェースメタクラスへのメソッドの追加は、一度しか動作しません
メソッドの再割り当ての間にmetaClassをクリーニングしても、何も変更されていないようです。ここで
は、実行可能な例である:
interface X {}
class A implements X {}
class B implements X {}
X.metaClass.test = { println "v1" }
new A().test()
new B().test()
X.metaClass.test = { println "v2" }
new A().test()
new B().test()
A.metaClass.test = { println "v3" }
B.metaClass.test = { println "v3" }
new A().test()
new B().test()
A.metaClass.test = { println "v4" }
B.metaClass.test = { println "v4" }
new A().test()
new B().test()
と結果は次のとおりです。
v1
v1
v1
v1
v3
v3
v4
v4
これは意図された動作ですか?もしそうなら、なぜですか?それともバグですか?
あなたは 'v2'を期待していますか?インタフェースでは、どのように同じメソッドを宣言できますか?一度右か? – Rao
出力が期待されます。あなたの期待は何ですか? – dsharew
そうです、 'X'インターフェースの' test'メソッドをオーバーライドすると、オーバーライドされた振る舞い、つまり "v2"文字列を表示するために呼び出されることが予想されます。 申し訳ありませんが、私はあなたの修辞的な質問の明白さを本当に理解していません。私が 'metaclass.someMethod'のようにsthを実行すると、私は実際に同じメソッドを2回宣言していないと思いますが、前の宣言をオーバーライドします。これを他の方法でやる方法はありますか? –