您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Scala中如何實(shí)現(xiàn)Trait的調(diào)用鏈”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Scala中如何實(shí)現(xiàn)Trait的調(diào)用鏈”吧!
2.實(shí)現(xiàn)Trait的調(diào)用鏈
如果多個Ttrait都含有同一個方法,Scala的類繼承多個Trait后,支持調(diào)用所有父Trait的同一方法,只需要在方法最后調(diào)用super方法即可。
定義Trait為BaseChecker,兩個子Trait分別為
DataChecker校驗(yàn)字段非空,
LengthChecker校驗(yàn)字段長度是否合法
字段類Field 分別順序繼承兩個校驗(yàn)類
package com.hadoop.ljs.spark.study.TraitTest/** * @author: Created By lujisen * @company ChinaUnicom Software JiNan * @date: 2020-02-15 16:45 * @version: v1.0 * @description: com.hadoop.ljs.spark.study.TraitTest */ trait BaseChecker{ /*這里有個知識點(diǎn)補(bǔ)充說明一下,如果checkResult()如果為抽象方法,繼承類在通過super.調(diào)用的時候,*/ /* 需要加上abstract 關(guān)鍵字,不然編譯會報錯*/ def checkResut(name:String): Unit ={ println("BaseChecker "+name) }}trait DataChecker extends BaseChecker { override def checkResut(name:String): Unit ={ println("DataChecker:數(shù)據(jù)不為空 "+name) //這里必須要調(diào)用super.checkResut() super.checkResut(name) }}trait LengthChecker extends BaseChecker { override def checkResut(name:String): Unit ={ println("LengthChecker:字段長度合法 "+name) //這里必須要調(diào)用super.checkResut() super.checkResut(name) }}class Field(data:String) extends LengthChecker with DataChecker { def printResult(): Unit ={ println("字段為:"+data) checkResut(data) }}
主函數(shù)測試類:
package com.hadoop.ljs.spark.study.TraitTest/** * @author: Created By lujisen * @company ChinaUnicom Software JiNan * @date: 2020-02-15 16:50 * @version: v1.0 * @description: com.hadoop.ljs.spark.study.TraitTest */object TraitChainTest { def main(args: Array[String]): Unit = { val field=new Field("field1") //這里按照繼承順序從右向左調(diào)用DataChecker、LengthChecker //,最后調(diào)用BaseChecker打印 field.printResult() }}
結(jié)果輸出為:
輸入字段為:field1DataChecker:數(shù)據(jù)不為空 field1LengthChecker:字段長度合法 field1BaseChecker field1
根據(jù)結(jié)果我們可以看出,這里函數(shù)printResult()會按照類Field的繼承順序,依次從右到左調(diào)用父Trait的統(tǒng)一函數(shù)checkResut(),最后才會調(diào)用BaseChecker中的函數(shù)checkResut(),這個特性我們可以用來做數(shù)據(jù)的校驗(yàn),不同的Trait實(shí)現(xiàn)不同的校驗(yàn)分工。這里類似于java中的責(zé)任鏈模式的具體實(shí)現(xiàn)。
相關(guān)知識補(bǔ)充:
Java責(zé)任鏈模式:
顧名思義,責(zé)任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發(fā)送者和接收者進(jìn)行解耦。這種類型的設(shè)計模式屬于行為型模式。
在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。
到此,相信大家對“Scala中如何實(shí)現(xiàn)Trait的調(diào)用鏈”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。