インターフェース で宣言しているメソッドをメタクラスで差し替える
インターフェースを実装しているクラスの一部のメソッドを差し替えるにはどうするの? - お だ のスペース の続き。
インスタンス を生成する前に、型の メタクラス で メソッド の上書き。そして インスタンス を生成後に、インスタンス の メタクラス でさらにメソッドを上書きすると変更されました。
interface ITest { void print(String target) } class Test implements ITest { void print(String target) { println "Test $target" } } class Test2 implements ITest { void print(String target) { println "Test2 $target" } } Test.class.metaClass.print = { String target -> println "Class Test $target" } def t = new Test() def t2 = new Test2() def msg = "ABC" t.print(msg) // Test ABC t2.print(msg) // Test2 ABC t.metaClass.print = { String target -> println "Instance Test $target" } t.print(msg) // Instance Test ABC t2.print(msg) // Test2 ABC
ただこれ取り合えずそう動いたというだけで何か間違ってる/勘違いしてる気がします、型のメタクラスだけの指定だと上書きされないし。
正しくはどうするんだろう?