2016-04-26 9 views
2

Используя черты, вы можете моделировать множественное наследование в 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)?

ответ

Смежные вопросы