在 Java 或者 Scala 的类中,super.method() 这样的方法调用是静态绑定的,也就是说当你在代码中写下 super.method() 的时候就能明确是调用它的父类的 method() 方法。
然而,如果是在特质中写下了 super.method() 时,它的调用是动态绑定的。调用的实现奖在每一次特质被混入到具体类的时候才被决定。
直截的讲就是超靠近后面的特质越优先起作用。当你调用带混入的类的方法是,最右侧特质的方法首先被调用。如果那个方法调用了 super,它调用其左侧特质的方法。
- object TraitTest {
- def main(args: Array[String]): Unit = {
- val person = new person with sayWorld with sayHello
- person.say("hey: ")
- }
- abstract class animal() {
- def say(something: String)
- }
- class person extends animal {
- var word = "I am person! "
- def say(something: String) {
- word = word + something
- print(word)
- }
- }
- trait sayWorld extends animal {
- abstract override def say(something: String) {
- super.say(something + "world. ")
- }
- }
- trait sayHello extends animal {
- abstract override def say(something: String) {
- super.say(something + "hello. ")
- }
- }
- }
输出结果:I am person! hey: hello. world.
tips:1.trait里super是动态绑定的。
2.在这种方法上,打上abstract override标志。