[scala]对abstract override的理解

在学习Scala trait中的abstract override时,不是非常理解其用途。通过查阅资料,结合自己体会,将理解记录下来以备回顾。

子trait C 重写父trait A时,假设方法叫m,重写的方法中使用了super.m。由于mixin机制,使得C能够通过编译,但C重写的m方法的动态父类很可能还是一个未实现的方法。这样,加入abstract override 就告诉编译器,C的动态父类的这个被重写的方法(即m)必须是实现的。可以等价于,C不能直接跟在extends后面,其前面必须有个实现xx方法的trait或类。

以下述代码为例:

trait Logger {
  def log(msg: String)
}

trait ShortLogger extends Logger {
  abstract override def log(msg: String) {
    super.log(if (msg.length <= 15) msg else s"${msg.substring(0, 12)}...")}
}

trait ConsoleLogger extends Logger {
  override def log(msg: String) {
    println("ConsoleLogger: "+msg)
  }
}
class TestLogger extends Logger{
  override def log(msg: String){
    println("TestLogger:" + msg)
  }
}
/*
class TestClass1 extends ShortLogger{} //编译失败
*/
class TestClass2 extends ConsoleLogger with ShortLogger{} //编译成功
class TestClass3 extends TestLogger with ShortLogger{} //编译成功

object Main extends App {
  val test2=new TestClass2
  test2.log("test222222222222")  //ConsoleLogger: test22222222...
  val test3=new TestClass3
  test3.log("test333333333333")  //输出:TestLogger: test33333333...
}

  其中:

    Logger是本例中顶级trait,ShortLogger、ConsoleLogger都是其子trait;

    ShortLogger未实现(或未完全实现)父trait的log方法;

    ConsoleLogger实现了父trait的log方法;

    TestClass1直接继承ShortLogger trait;

    TestClass2继承ConsoleLogger trait(mixin)、ShortLogger trait;

    TestClass3继承TestLogger 类(mixin)、ShortLogger trait。

参考:

源码修改自 http://horstmann.com/scala/index.html    【source code:scala-impatient-2e-code.zip\ch10\sec06\Logger.scala 】

原创,本文链接: http://www.cnblogs.com/ahawkin/p/8743755.html 

posted on 2018-04-08 11:07  A.Hawkin  阅读(584)  评论(0)    收藏  举报