參考文獻(xiàn):《快學(xué)Scala》第十章
package learn
/**
* Created by wjf on 2016/8/4.
*/
object TestTrait {
def main(args: Array[String]) {
val fishEagle =new FishEagle
val flyable:Flyable=fishEagle
val swimmer:Swimable=fishEagle
flyable.fly
swimmer.swim
}
}
/* 類似于interface 钾挟,可以翻譯為特征夯到, 所以使用 with 茂契,而不是implements,可以實(shí)現(xiàn)部分函數(shù),這點(diǎn)不同于java
trait 的存在主要是為了實(shí)現(xiàn)多繼承吧雹,具有多個(gè)特征骨杂,
讓特質(zhì)擁有具體行為存在一個(gè)弊端,當(dāng)特質(zhì)改變時(shí)雄卷,所有混入了該特質(zhì)的類必須重新編譯
*/
trait Flyable{
def hasFeather =true
def fly
}
trait Swimable{
def swim
}
abstract class Animal{
def walk(speed:Int)
def breathe()={
println("animal breathers")
}
}
class FishEagle extends Animal with Flyable with Swimable{
override def walk(speed: Int) = println("" + "fih eagle walk with speed"+speed)
override def fly: Unit =println("fish eagle fly fast")
override def swim: Unit = println("fish eagle swim fast")
}
/*
* object with trait*/
trait Logged{
def log(msg:String){}
}
class SavingsAccount extends Logged{
def withdraw(amount :Double): Unit ={
if(amount > 10 ) log("insufficient funds")
else {}
}
}
// 構(gòu)造對(duì)象的時(shí)候可以加入不同的特質(zhì)
// val acct =new SavingsAccount with ConsoleLogger
// val acct2=new SavingsAccount with FileLogger
//特質(zhì) 執(zhí)行的順序 由后向前
// val acct1= new SavingsAccount with TimestampLogger with ShortLogger
// val acct2= new SavingsAccount with ShortLogger with TimestampLogger
// 如果需要 控制具體是哪一個(gè)特質(zhì)比被調(diào)用 ,可以使用 super[ShortLogger].log(...)
// 在特質(zhì)中重寫方法
trait Logger{
def log(msg:String)
}
trait TimestampLogger extends Logger{
override def log(msg:String): Unit ={
super.log(new java.util.Date()+msg)
}
}
// 上面的方法調(diào)用了 super.log 但是 super.log并沒(méi)有實(shí)現(xiàn)蛤售,所以需要加上abstract 關(guān)鍵字
// 特質(zhì)與類的唯一技術(shù)區(qū)別是 缺少構(gòu)造器參數(shù)丁鹉,特質(zhì)不能有構(gòu)造器參數(shù)妒潭,每個(gè)特質(zhì)都有呀一個(gè)無(wú)參數(shù)的構(gòu)造器
/*t
*特質(zhì)背后發(fā)生了什么
* Scala 需要將特質(zhì)翻譯成JVM 的類和接口。背后的原理是:
* 只有抽象方法的特質(zhì)被翻譯成了接口
* 如果特質(zhì)中有具體的方法Scala 會(huì)幫我們創(chuàng)建出一個(gè)伴生類揣钦,該伴生類用靜態(tài)方法存放特質(zhì)的方法
* 這些伴生類不會(huì)有任何字段雳灾,特質(zhì)中的字段對(duì)應(yīng)到接口中的抽象的Getter 和 Setter 方法
*
* 如果特質(zhì)實(shí)現(xiàn)某個(gè)超類,則伴生類不會(huì)繼承該超類冯凹,該超類會(huì)被任何實(shí)現(xiàn)該特質(zhì)的類繼承*/