Используя черты, вы можете моделировать множественное наследование в groovy. Рассмотрим следующий код, в котором простой алмаз моделируется с помощью A, B, C и X. Кроме того, признак F служит конечной точкой.Почему порядок разрешения метода в groovy нестандартный?
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)?