在 Java 或者 Scala 的类中,super.foo() 这样的方法调用是静态绑定的,也就是说当你在代码中写下 super.foo() 的时候就能明确是调用它的父类的 foo() 方法。然而,如果是在特质中写下了 super.foo() 时,它的调用是动态绑定的。调用的实现奖在每一次特质被混入到具体类的时候才被决定。
确切的讲,特质的 super 调用与混入的次序很重要,参照下面的例子说话:
1 |
val queue = (new BasicIntQueue with Incrementing with Doubling) |
直截的讲就是超靠近后面的特质越优先起作用。当你调用带混入的类的方法是,最右侧特质的方法首先被调用。如果那个方法调用了 super,它调用其左侧特质的方法。可以这么认为,Doubling 的 super 指向了 Incrementing,Incrementing 的 super 指向了 BasicIntQueue。
来看个完整的实例实际体验一把,如果要帮助理解,最好应该实际运行一下这个实例 阅读全文 >>