千家信息网

Scala中如何实现Trait的调用链

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容主要讲解"Scala中如何实现Trait的调用链",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Scala中如何实现Trait的调用链"吧!2.实现
千家信息网最后更新 2025年02月01日Scala中如何实现Trait的调用链

本篇内容主要讲解"Scala中如何实现Trait的调用链",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Scala中如何实现Trait的调用链"吧!

2.实现Trait的调用链

如果多个Ttrait都含有同一个方法,Scala的类继承多个Trait后,支持调用所有父Trait的同一方法,只需要在方法最后调用super方法即可。

定义Trait为BaseChecker,两个子Trait分别为

DataChecker校验字段非空,

LengthChecker校验字段长度是否合法

字段类Field 分别顺序继承两个校验类

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{  /*这里有个知识点补充说明一下,如果checkResult()如果为抽象方法,继承类在通过super.调用的时候,*/  /* 需要加上abstract 关键字,不然编译会报错*/    def checkResut(name:String): Unit ={    println("BaseChecker  "+name)  }}trait DataChecker extends BaseChecker {  override def checkResut(name:String): Unit ={    println("DataChecker:数据不为空  "+name)    //这里必须要调用super.checkResut()    super.checkResut(name)  }}trait LengthChecker  extends BaseChecker {  override def checkResut(name:String): Unit ={    println("LengthChecker:字段长度合法  "+name)     //这里必须要调用super.checkResut()    super.checkResut(name)  }}class Field(data:String) extends LengthChecker with DataChecker {    def printResult(): Unit ={      println("字段为:"+data)      checkResut(data)    }}

主函数测试类:

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")    //这里按照继承顺序从右向左调用DataChecker、LengthChecker     //,最后调用BaseChecker打印    field.printResult()  }}

结果输出为:

输入字段为:field1DataChecker:数据不为空  field1LengthChecker:字段长度合法  field1BaseChecker  field1

根据结果我们可以看出,这里函数printResult()会按照类Field的继承顺序,依次从右到左调用父Trait的统一函数checkResut(),最后才会调用BaseChecker中的函数checkResut(),这个特性我们可以用来做数据的校验,不同的Trait实现不同的校验分工。这里类似于java中的责任链模式的具体实现。

相关知识补充:

Java责任链模式:

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

到此,相信大家对"Scala中如何实现Trait的调用链"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0