【发布时间】:2017-08-19 11:50:43
【问题描述】:
因此,将方法添加到接口元类会将其添加到接口实现的每个实例中——但只有一次。将方法添加到每个实现类每次都有效,以进行更改。
在重新分配方法之间清理元类似乎没有任何改变。
这是一个可运行的示例:
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
这是预期的行为吗?如果是这样,那为什么?还是bug?
【问题讨论】:
-
您期待
v2吗?在接口中,同一个方法可以声明多少次?一次对吗? -
预期输出;你的期望是什么?
-
没错,我希望在
X接口上覆盖test方法会调用它以使用被覆盖的行为——即打印“v2”字符串。对不起,但我真的不明白你的反问问题的明显性。当我像metaclass.someMethod那样做某事时,我希望我不是真的两次声明相同的方法,而是覆盖之前的声明。有没有其他方法可以做到这一点? -
另外,如果执行“metaClass.someMethod”被解释为“两次声明相同的方法”而不是覆盖以前的实现(因为它似乎 is 在执行目标类上的相同内容)我希望有某种异常。