[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 】
浙公网安备 33010602011771号