Scala面向物件程式設計之Trait高階程式設計技術實踐-JVM生態程式語言實戰
《JVM生態程式語言實戰》來源於被一位容器雲專家問道如何實現一個執行緒池時,讓我頓感以前研究的Java併發控制相關的理論以及多執行緒併發設計模式忘得九霄雲外,鑑於此,氣憤難平,決定提升程式設計技術。
版權宣告:本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。QQ郵箱地址:[email protected],如有任何技術交流,可隨時聯絡。
1 知識概要
1.1 trait基礎知識
- 1-1 將trait作為介面使用
- 1-2 在trait中定義具體方法
- 1-3 在trait中定義具體欄位
- 1-4 在trait中定義抽象欄位
1.2 trait高階知識
- 2-1 為例項物件混入trait
- 2-2 trait呼叫鏈
- 2-3 在trait中覆蓋抽象方法
- 2-4 混合使用trait的具體方法和抽象方法
- 2-5 trait的構造機制
- 2-6 trait欄位的初始化
- 2-7 讓trait繼承類
2 詳細使用
2.1 將trait作為介面使用
-
Scala中的Triat是一種特殊的概念
-
可以將Trait作為介面來使用,此時的Triat就與Java中的介面非常類似
-
在triat中可以定義抽象方法,就與抽象類中的抽象方法一樣,只要不給出方法的具體實現即可
-
類可以使用extends關鍵字繼承,trait在scala中沒有implement的概念,無論繼承類還是trait,統一都是extends
-
類繼承trait後,必須實現其中的抽象方法,實現時不需要使用override關鍵字
-
scala不支援對類進行多繼承,但是支援多重繼承trait,使用with關鍵字即可
trait HelloTrait { def sayHello(name: String) } trait MakeFriendsTrait { def makeFriends(p: Person) } class Person(val name: String) extends HelloTrait with MakeFriendsTrait with Cloneable with Serializable { def sayHello(name: String) = println("Hello, " + name) def makeFriends(p: Person) = println("Hello, my name is " + name + ", your name is " + p.name) } 複製程式碼
2.2 在Trait中定義具體方法
-
Scala中的Triat可以不是隻定義抽象方法,還可以定義具體方法,此時trait更像是包含了通用工具方法的東西, 有一個專有的名詞來形容這種情況,就是說trait的功能混入了類
-
舉例來說,trait中可以包含一些很多類都通用的功能方法,比如列印日誌等等,spark中就使用了trait來定義了通用的日誌列印方法
trait Logger { def log(message: String) = println(message) } class Person(val name: String) extends Logger { def makeFriends(p: Person) { println("Hi, I'm " + name + ", I'm glad to make friends with you, " + p.name) log("makeFriends methdo is invoked with parameter Person[name=" + p.name + "]") } } 複製程式碼