trait的構造機制
如果乙個類實現了多個trait,那這些trait是如何構造的呢?
定義
trait也有構造**,但和類不一樣,特質不能有構造器引數
每個特質只有乙個無引數的構造器。
乙個類繼承另乙個類、以及多個trait,當建立該類的例項時,它的構造順序如下:
執行父類的構造器
從左到右依次執行trait的構造器
如果trait有父trait,先構造父trait,如果多個trait有同樣的父trait,則只初始化一次
執行子類構造器
示例
示例說明
定義多個特質,然後用乙個類去實現它們
測試trait的構造順序
步驟:建立乙個logger特質,在構造器中列印"執行logger構造器!"
建立乙個mylogger特質,繼承自logger特質,,在構造器中列印"執行mylogger構造器!"
建立乙個timelogger特質,繼承自logger特質,在構造器中列印"執行timelogger構造器!"
建立乙個person類,在構造器中列印"執行person構造器!"
建立乙個student類,繼承自person、mylogger、timelogge特質,在構造器中列印"執行student構造器!"
新增main方法,例項化student_one類,觀察輸出。
參考**:
trait logger
trait mylogger extends logger
trait timelogger extends logger
class person
class student extends person with timelogger with mylogger
def main(args: array[string]
): unit =
// 程式執行輸出如下:
// 執行person構造器
// 執行logger構造器
// 執行timelogger構造器
// 執行mylogger構造器
// 執行student構造器
結果:
scala的物件混入trait
物件混入trait scala中可以將trait混入到物件中,就是將trait中定義的方法 字段新增到乙個物件中 定義 語法val var 物件名 new 類 with 特質 copy 示例給乙個物件新增一些額外的行為 步驟 建立乙個logger特質 新增乙個log實現方法,列印引數 建立乙個use...
scala的使用trait實現模板模式
使用trait實現模板模式 要實現以下需求 實現乙個輸出日誌的功能 目前要求輸出到控制台 將來可能會輸出到檔案 輸出到redis 或者更多的需求 如何實現將來不修改之前的 來擴充套件現有功能呢?定義 在乙個特質中,具體方法依賴於抽象方法,而抽象方法可以放到繼承trait的子類中實現,這種設計方式也稱...
Scala的構造器
每個類都有主構造器,主構造器的引數直接放置類名後面,與類交織在一起 class student val name string,val age int catch finally private var gender male 用this關鍵字定義輔助構造器 def this name string...