为什么方法解析顺序在groovy非标准?

时间:2016-04-26 16:46:52

标签: groovy

使用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.fB.f之前被称为,尽管AB的超类。因此在子类方法之前调用超类方法。这似乎都错了。

在Python,Scala和Common Lisp中,类似代码的输出为C B A F,即AFAIK,称为C3 Linearization

选择方法解析顺序背后的意图是什么,还是只是groovy中的一个错误(2.4.6)?

1 个答案:

答案 0 :(得分:0)

定义的顺序in the documentation

section about conflict resolution

中有另一位

这不是一个错误