一、 將trait做爲接口使用設計模式
二、trait中定義具體方法ide
三、trait定義具體字段函數
四、trait中定義抽象字段工具
五、爲實例對象混入traitspa
六、trait調用鏈scala
七、在trait中覆蓋抽象方法設計
八、混合使用trait的具體方法和抽象方法3d
九、trait的構造機制日誌
十、trait field的初始化對象
十一、trait繼承class
在scala中,trait是一種特殊的概念,能夠將trait做爲接口來使用。
Trait能夠定義抽象方法,與抽象類中的抽象方法同樣,只要不給出方法的具體實現便可。
類可使用extends關鍵字繼承trait,sclaa中沒有implement的概念,不管繼承仍是trait。
類繼承trait後,必須實現其中的抽象方法,實現時不須要使用override關鍵字。
Scala不支持對類進行多繼承,可是支持多繼承trait,使用with關鍵字便可。
Trait不是隻定義抽象方法,還能夠定義具體方法,此時trait更像是包含了通用工具的方法。
有一個專有名詞來形容這種狀況,就是說trait的功能混入了類。
Trait中能夠包含一些不少類都通用的功能方法,好比打印日誌等等。
Trait能夠定義具體field,此時繼承trait的類就自動得到了trait中定義的field。
這種獲取field的方式與繼承class是不一樣的,若是是繼承class獲取的field,其實是定義在父類中的,而繼承trait獲取的field,就直接被添加到了類中。
Trait能夠定義抽象field,而trait中的具體方法則能夠基於抽象field來編寫。
繼承trait的類,必須覆蓋抽象field,並提供具體的值。
有時候咱們建立類的時候,指定該對象混入某個trait,這樣就只有這個對象混入該trait的方法,而類的其餘對象則沒有。
Scala中支持讓類繼承多個trait,依次調用多個trait中的同一個方法,只要讓多個trait的同一個方法中,在最後都執行supper方法便可。
類中調用多個trait中都有的這個方法時,首先會從最右邊的trait的方法開始執行,依次往左執行,造成一個調用鏈條。
這種特性很是強大,其實就至關於設計模式中的責任鏈模式的一種具體實現依賴。
Trait中,能夠覆蓋父trait的抽象方法。覆蓋時,若是使用了super.方法的代碼,則沒法經過編譯。由於super.方法就會去掉用父trait的抽象方法,此時子trait的該方法仍是會被認爲是抽象的。若是要經過編譯,就得給trait的方法加上abstract override修飾。
在trait中,能夠混合使用具體方法和抽象方法,可讓具體方法依賴於抽象方法,而抽象方法則放在繼承trait的類中去實現。
這種trait其實就是設計模式中的模板設計模式的體現。
Trait有構造函數,就是不包含任何方法中的代碼。
而繼承了trait的類的構造機制以下:
一、 父類的構造函數執行
二、 Trait的構造代碼執行,多個trait從左到右依次執行
三、 構造trait時會先構造父trait,若是多個trait繼承同一個父trait,則父trait只會構造一次。
四、 全部trait構造完畢後,子類的構造函數執行。
Scala中,trait沒有接受參數的構造函數,若是需求就是要trait能對field進行初始化,只能使用scala中很是特殊的一種高級特性,即提早定義。
兩種提早定義
另一種方式就是使用lazy value
Scala中,trait能夠繼承自class,此時這個class就會成爲全部繼承該trait的類的父類。