Scala学习笔记 A2/L1篇 - 特质Traits

2018-08-10  本文已影响0人  hakase_nano

教材:快学Scala

chapter 10. 特质 Traits

10.1 为什么没有多重继承

10.2 当接口使用的特质

class ConsoleLogger extends Logger with Cloneable with Serializable { def log(msg: String) }

10.3 带具体实现的特质

10.4 带有特质的对象

trait Logged {
    def log(msg: String) { } // 一个空的实现
}
class SavingAccount extends Account with Logged {
    def withDraw(...) {
        ...
        log("xxx") // 混入Logged的log方法 但目前还是空的实现
    }
}
trait ConsoleLogger extends Logged { 
    override def log(msg: String ) {...} // 有一个更好的实现
}

val acct = new SavingAccount with ConsoleLogger // 在具体对象中混入更好的实现,不再是空实现
val acct2 = new SavingAccount with FileLogger

10.5 叠加在一起的特质

10.6 重写抽象方法

10.7 具体方法中调用抽象方法

trait Logger {
    def log(msg: String)
    def info(msg: String) { log("INFO: " + msg) } // 具体方法里调用了抽象方法
    ...
}

10.8 特质中的字段

val acct = new SavingsAccount with ConsoleLogger with ShortLogger {
    val maxLength = 20 // 在ShortLogger里的maxLength是抽象的,所以在被with的时候需要具体化
}

10.10 构造器执行顺序

10.11 初始化抽象字段

10.12 trait extends class

trait T1 extends C1 {...} // T1扩展了类C1
class C2 extends T1 {...} // C1自动变成C2的父类!!
class C3 extends C0 with T1 {...} // 条件:C1是C0的父类!!

10.13 self type机制

trait T1 {
    this: C1 =>
    ...
} // 指定了T1只能混入C1的子类
trait T1 {
    this: { def getMsg(): String } =>
    ...
} // 指定了T1只能混入带有getMsg方法的类
上一篇 下一篇

猜你喜欢

热点阅读