特質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= 1
  def query(id:String):List[Any]=List(1,2,3)
}

//繼承多個trait
class DaoImpl extends MysqlDAO with Cloneable{
  def add(o:Any):Boolean=true
  def update(o:Any):Int= 1
  def query(id:String):List[Any]=List(1,2,3)
}

多種使用方式

類似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=15000000000000L

  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
上述構造器的執行順序爲:
1 首先調用父類Person的構造器
2 調用父trait Logger的構造器
3 再調用trait FileLogger構造器,再然後調用Cloneable的構造器
4 最後才調用Student的構造器

忠於技術,熱愛分享。歡迎關注公衆號:java大數據編程,瞭解更多技術內容。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章