天天看點

特質trait(十六)

簡介

  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大資料程式設計,了解更多技術内容。

特質trait(十六)