Scala 学习(8)之「trait (2) 」
trait调用链
- Scala 中支持让类继承多个 trait 后,依次调用多个 trait 中的同一个方法,只要让多个 trait 的同一个方法中,在最后都执行
super.
方法即可 - 类中调用多个 trait 中都有的这个方法时,首先会从最右边的 trait 的方法开始执行,然后依次往左执行,形成一个调用链条
- 这种特性非常强大,其实就相当于设计模式中的责任链模式的一种具体实现依赖
trait Handler { def handle(data: String) {} //方法 } trait DataValidHandler extends Handler { override def handle(data: String) { //覆盖并实现父类的方法 println("check data: " + data) super.handle(data) } } trait SignatureValidHandler extends Handler { override def handle(data: String) { //覆盖并实现父类的方法 println("check signature: " + data) super.handle(data) } } class Person(val name: String) extends SignatureValidHandler with DataValidHandler { def sayHello = { println("Hello, " + name); handle(name) } } val person = new Person("0mifang") // Hello, 0mifang // check data: 0mifang // check signature: 0mifang person.sayHello
在 trait 中覆盖抽象方法
覆盖时,如果使用了super.
方法的代码,则无法通过编译。因为super.
方法就会去调用父 trait 的抽象方法,此时子 trait 的该方法还是会被认为是抽象的,此时如果要通过编译,就得给子 trait 的方法加上 abstract override 修饰
trait Logger { def log(msg: String) } trait MyLogger extends Logger { abstract override def log(msg: String) { super.log(msg) } }
混合使用 trait 的具体方法和抽象方法
- 可以让具体方法依赖于抽象方法,而抽象方法则放到继承 trait 的类中去实现
- 这种 trait 其实就是设计模式中的模板设计模式的体现
trait Valid { def getName: String //抽象方法 def valid: Boolean = { //检验输入名称的方法 getName == "0mifang" } } class Person(val name: String) extends Valid { 。。。
扫码查看历史消息,可获得完整版文章
相关推荐
匆匆那些年 2020-10-15
TheBigBlue 2020-07-28
shenwenjie 2020-07-07
muhongdi 2020-07-07
waitwolf 2020-07-08
yunfenglee 2020-07-08
yunfenglee 2020-07-08
kekeromer 2020-07-08
匆匆那些年 2020-07-07
liqinglin0 2020-07-05
TheBigBlue 2020-07-05
kekeromer 2020-06-13
zhixingheyitian 2020-06-08
TheBigBlue 2020-06-06
liqinglin0 2020-06-01
liqinglin0 2020-06-01
yunfenglee 2020-05-30
MICKEYSTUDY 2020-05-28
muhongdi 2020-05-19