版權(quán)申明:轉(zhuǎn)載請注明出處症副。
文章來源:http://bigdataer.net/?p=317
總體來說店雅,scala中的特質(zhì)類似于Java中的接口,但是有別于接口的是特質(zhì)中既可以有實(shí)現(xiàn)方法也可以有抽象方法贞铣。
1.特質(zhì)的定義
使用關(guān)鍵字trait來定義一個特質(zhì)闹啦,如:
trait Log{
def info(msg:String)
def debug(msg:String){print(msg)}
}
2.特質(zhì)的使用
通過關(guān)鍵字extends來使用特質(zhì),這樣辕坝,使用了特質(zhì)的這個類就混入了特質(zhì)的實(shí)現(xiàn)方法和抽象方法窍奋。其中,實(shí)現(xiàn)方法可以直接使用酱畅,抽象方法可以在類中實(shí)現(xiàn)琳袄,需要注意的是重寫這些方法不需要使用注解override。如:
class Cat extends Log{
//實(shí)現(xiàn)抽象方法
def info(msg:String){print("I am a cat")}
//直接使用已實(shí)現(xiàn)的方法
debug("I am running")
}
3.特質(zhì)的疊加
可以為一個類添加多個特質(zhì)纺酸,使用關(guān)鍵字with連接窖逗。如果添加的多個特質(zhì)里面有相同的方法,可以使用super[T].method()來指定使用哪個特質(zhì)里面的方法餐蔬。如下:
class Cat extends Log with Play{
}
加入Log和Play中都有一個方法error(),需要指定調(diào)用Log里面的error時可以這樣寫super[Log].error()
4.特質(zhì)重寫特質(zhì)的抽象方法
前面提到類重寫特質(zhì)的抽象方法不需要加override,但是假如有一個特質(zhì)ConsleLog需要重寫特質(zhì)Log的抽象方法log,則需要添加override和abstract碎紊,scala認(rèn)為這樣重寫后的方法也是抽象的。如:
trait ConsleLog extends Log{
abstract override def log(msg:String){
super.log("consle:"+msg)
}
}
5.特質(zhì)擴(kuò)展類
特質(zhì)可以擴(kuò)展特質(zhì)樊诺,在scala中特質(zhì)可以擴(kuò)展類仗考,有點(diǎn)不可思議,但確實(shí)可以词爬。如特質(zhì)LogException擴(kuò)展了Exception類秃嗜。若Account這個類使用了特質(zhì)LogException,則Exception會自動成為Account的超類顿膨,可以使用Exception中可用的方法痪寻。
更多文章請關(guān)注微信公眾號:bigdataer