2016-04-26 7 views
2

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.fvorB.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)?

Antwort

Verwandte Themen