溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Scala中如何實(shí)現(xiàn)Trait的調(diào)用鏈

發(fā)布時間:2021-12-08 15:21:48 來源:億速云 閱讀:149 作者:iii 欄目:大數(shù)據(jù)

本篇內(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í)!

向AI問一下細(xì)節(jié)

免責(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)容。

AI