10 scala物件導向程式設計之Trait

2022-07-17 05:57:09 字數 2640 閱讀 9060

1、  將trait作為介面使用

2、trait中定義具體方法

3、trait定義具體字段

4、trait中定義抽象字段

5、為例項物件混入trait

6、trait呼叫鏈

7、在trait中覆蓋抽象方法

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

9、trait的構造機制

10、trait field的初始化

11、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的類的構造機制如下:

1、  父類的建構函式執行

2、  trait的構造**執行,多個trait從左到右依次執行

3、  構造trait時會先構造父trait,如果多個trait繼承同乙個父trait,則父trait只會構造一次。

4、  所有trait構造完畢後,子類的建構函式執行。

scala中,trait沒有接受引數的建構函式,如果需求就是要trait能對field進行初始化,只能使用scala中非常特殊的一種高階特性,即提前定義。

兩種提前定義

另外一種方式就是使用lazy value

scala中,trait可以繼承自class,此時這個class就會成為所有繼承該trait的類的父類。

Scala 物件導向程式設計之類

定義類,包含 field 以及方法 class helloworld def getname name 建立類的物件,並呼叫其方法 val helloworld new helloworld helloworld.sayhello print helloworld.getname 也可以不加括號,如...

SCALA物件導向程式設計(二)

五 隱式轉換和隱式函式 5.1隱式轉換 implicit def a d double d.toint 先宣告隱式函式,宣告後就不用管,程式過不去,會自動查詢。val i1 int 3.5 ok 當發現程式有誤時,scala編譯器會嘗試在隱式函式列表中查詢可以進行轉換的函式 注意 5.2利用隱式轉換...

scala的物件導向程式設計

一 簡單的程式設計 1.scala的簡單程式設計 1 packageer2 3class people 9 def watchfootball teamname string string 12 13object two 22 2.效果 3.構造方法 主構造方法,輔助構造方法。輔助建構函式是在主建構...