使用traits,您可以在groovy中建模多重继承。考虑以下代码,其中使用A,B,C和X对简单钻石进行建模。此外,特性F用作终点。
trait A {
def f() {
println("A")
super.f()
}
}
trait B extends A {
def f() {
println("B")
super.f()
}
}
trait C extends A {
def f() {
println("C")
super.f()
}
}
trait F {
def f() { println("F") }
}
class X implements F,B,C { }
def x = new X()
x.f()
该程序的输出是:
C
A
B
F
请注意,A.f
在 B.f
之前被称为,尽管A
是B
的超类。因此在子类方法之前调用超类方法。这似乎都错了。
在Python,Scala和Common Lisp中,类似代码的输出为C B A F
,即AFAIK,称为C3 Linearization。
选择方法解析顺序背后的意图是什么,还是只是groovy中的一个错误(2.4.6)?