簡介
scala和java語言一樣,采用了很強的限制政策,避免了多種繼承的問題。在java語言中,隻允許繼承一個超類,該類可以實作多個接口,但java接口有其自身的局限性:接口中隻能包括抽象方法,不能包含字段、具體方法。Scala語言利用Trait解決了該問題,在scala的trait中,它不但可以包括抽象方法還可以包含字段和具體方法。
簡單執行個體
trait MysqlDAO{
def add(o:Any):Boolean
def update(o:Any):Int
def query(id:String):List[Any]
}
//繼承單個trait
class DaoImpl extends MysqlDAO{
def add(o:Any):Boolean=true
def update(o:Any):Int=
def query(id:String):List[Any]=List(,,)
}
//繼承多個trait
class DaoImpl extends MysqlDAO with Cloneable{
def add(o:Any):Boolean=true
def update(o:Any):Int=
def query(id:String):List[Any]=List(,,)
}
多種使用方式
類似java接口的trait
//trait定義示範
trait DAO{
//定義一個抽象方法,注意不需要加abstract
//加了abstract反而會報錯
def delete(id:String):Boolean
def add(o:Any):Boolean
def update(o:Any):Int
def query(id:String):List[Any]
}
帶具體實作的trait
trait DAO{
//delete方法有具體實作
def delete(id:String):Boolean={
println("delete implementation")
true
}
def add(o:Any):Boolean
def update(o:Any):Int
def query(id:String):List[Any]
}
帶抽象字段的trait
trait DAO{
var recodeMount:Long
def delete(id:String):Boolean={
println("delete implementation")
true
}
def add(o:Any):Boolean
def update(o:Any):Int
def query(id:String):List[Any]
}
具體字段的trait
trait DAO{
var recodeMount:Long=
def delete(id:String):Boolean={
println("delete implementation")
true
}
def add(o:Any):Boolean
def update(o:Any):Int
def query(id:String):List[Any]
}
構造順序
- 如果有超類,則先調用超類的構造器
- 如果有父trait,它會按照繼承層次先調用父trait的構造器
- 如果有多個父trait,則按順序從左到右執行
- 所有父類構造器和父trait被構造完之後,才會構造本類
class Person
class Student extends Person with FileLogger with Cloneable
上述構造器的執行順序為:
首先調用父類Person的構造器
調用父trait Logger的構造器
再調用trait FileLogger構造器,再然後調用Cloneable的構造器
最後才調用Student的構造器
忠于技術,熱愛分享。歡迎關注公衆号:java大資料程式設計,了解更多技術内容。
