十、scala面向對象編程之Trait

一、  將trait做爲接口使用設計模式

二、trait中定義具體方法ide

三、trait定義具體字段函數

四、trait中定義抽象字段工具

五、爲實例對象混入traitspa

六、trait調用鏈scala

七、在trait中覆蓋抽象方法設計

八、混合使用trait的具體方法和抽象方法3d

九、trait的構造機制日誌

十、trait field的初始化對象

十一、trait繼承class

一、  將trait做爲接口使用

  在scala中,trait是一種特殊的概念,能夠將trait做爲接口來使用。

  Trait能夠定義抽象方法,與抽象類中的抽象方法同樣,只要不給出方法的具體實現便可。

  類可使用extends關鍵字繼承trait,sclaa中沒有implement的概念,不管繼承仍是trait。

  類繼承trait後,必須實現其中的抽象方法,實現時不須要使用override關鍵字。

  Scala不支持對類進行多繼承,可是支持多繼承trait,使用with關鍵字便可。

  

二、trait中定義具體方法

  Trait不是隻定義抽象方法,還能夠定義具體方法,此時trait更像是包含了通用工具的方法。

  有一個專有名詞來形容這種狀況,就是說trait的功能混入了類。

  Trait中能夠包含一些不少類都通用的功能方法,好比打印日誌等等。

   

三、trait定義具體字段

  Trait能夠定義具體field,此時繼承trait的類就自動得到了trait中定義的field。

  這種獲取field的方式與繼承class是不一樣的,若是是繼承class獲取的field,其實是定義在父類中的,而繼承trait獲取的field,就直接被添加到了類中。

   

四、trait中定義抽象字段

  Trait能夠定義抽象field,而trait中的具體方法則能夠基於抽象field來編寫。

  繼承trait的類,必須覆蓋抽象field,並提供具體的值。

  

五、爲實例對象混入trait

  有時候咱們建立類的時候,指定該對象混入某個trait,這樣就只有這個對象混入該trait的方法,而類的其餘對象則沒有。

   

六、trait調用鏈

  Scala中支持讓類繼承多個trait,依次調用多個trait中的同一個方法,只要讓多個trait的同一個方法中,在最後都執行supper方法便可。

  類中調用多個trait中都有的這個方法時,首先會從最右邊的trait的方法開始執行,依次往左執行,造成一個調用鏈條。

  這種特性很是強大,其實就至關於設計模式中的責任鏈模式的一種具體實現依賴。

  

七、在trait中覆蓋抽象方法

  Trait中,能夠覆蓋父trait的抽象方法。覆蓋時,若是使用了super.方法的代碼,則沒法經過編譯。由於super.方法就會去掉用父trait的抽象方法,此時子trait的該方法仍是會被認爲是抽象的。若是要經過編譯,就得給trait的方法加上abstract override修飾。

  

八、混合使用trait的具體方法和抽象方法

  在trait中,能夠混合使用具體方法和抽象方法,可讓具體方法依賴於抽象方法,而抽象方法則放在繼承trait的類中去實現。

  這種trait其實就是設計模式中的模板設計模式的體現。

  

九、trait的構造機制

  Trait有構造函數,就是不包含任何方法中的代碼。

  而繼承了trait的類的構造機制以下:

  一、  父類的構造函數執行

  二、  Trait的構造代碼執行,多個trait從左到右依次執行

  三、  構造trait時會先構造父trait,若是多個trait繼承同一個父trait,則父trait只會構造一次。

  四、  全部trait構造完畢後,子類的構造函數執行。

  

十、trait field的初始化

  Scala中,trait沒有接受參數的構造函數,若是需求就是要trait能對field進行初始化,只能使用scala中很是特殊的一種高級特性,即提早定義。

  兩種提早定義

  

  另一種方式就是使用lazy value

  

十一、trait繼承class

  Scala中,trait能夠繼承自class,此時這個class就會成爲全部繼承該trait的類的父類。

  

相關文章
相關標籤/搜索