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.構造方法 主構造方法,輔助構造方法。輔助建構函式是在主建構...