Mit Traits können Sie die Mehrfachvererbung in groovy modellieren. Betrachten Sie den folgenden Code, wo ein einfacher Diamant mit A, B, C und X modelliert wird. Darüber hinaus dient Merkmal F als Endpunkt.Warum ist die Reihenfolge der Methodenauflösung in groovy nicht-Standard?
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()
Der Ausgang dieses Programm ist:
C
A
B
F
Beachten Sie, dass A.f
vorB.f
trotz A
eine Oberklasse von B
sein genannt wird. Daher wird eine Superklassenmethode vor der Unterklassenmethode aufgerufen. Das scheint alles falsch zu sein.
In Python, Scala und Common Lisp wäre die Ausgabe von ähnlichem Code C B A F
, die AFAIK ist bekannt als C3 Linearization.
Was ist die Absicht hinter dieser Wahl der Reihenfolge der Methodenauflösung, oder ist es einfach nur ein Fehler in groovy (2.4.6)?