risc-v中文社区

 找回密码
 立即注册
查看: 1058|回复: 0

[原创] risc-v开发基础 Scala 责任链模式2---(18)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-5 15:59:50 | 显示全部楼层 |阅读模式
上一帖中,我们通过在子类的方法中用super调用抽象父类的同名方法(空函数体),实验成功了,如果多个trait都继承自那个父类,然后定义一个新类,让这个新类with这些trait,然后在新类中
调用这个方法,会是什么现象呢?
abstract class Parent_Nor{
  println("Parent_Nor constructor.......")
  def info(): Unit ={
    println("info")
  }
  def disp():Unit ={} //空函数
}
trait trait1 extends Parent_Nor {
  println("trait1 constructor.......")
  override def disp(): Unit = {
    println("trait1 disp......")
    super.disp()
  }
}
trait trait2 extends Parent_Nor {
  println("trait2 constructor.......")
  override def disp(): Unit = {
    println("trait2 disp......")
    super.disp()
  }
}
class ConcretP extends Parent_Nor {
  println("ConcretP constructor......")
}
class Concretclass extends ConcretP with trait1 with trait2{
  println("Concretclass constructor......")
}
在main中:
val cp = new Concretclass
cp.disp()
显示如下:
Parent_Nor constructor.......
ConcretP constructor......
trait1 constructor.......
trait2 constructor.......
Concretclass constructor......
trait2 disp......
trait1 disp......
构造顺序还是先父构造,再各个trait从左到右构造,中途如果有父类或父trait已构造则不用再构造,这些我们以前介绍过了,关键是disp方法的执行,
构造时是先构造trait1再trait2,而执行时却是行trait2.disp再trait1.disp,我们只在main中cp.disp了一次,可是各个trait中的disp都执行了一遍,
并且是按从右到左的顺序执行的,这就是调用链模式。
上面这种调用链模式在实际中使用应该不多,实际中要想使用这种调用链,应该将Parent_Nor设计成trait,做做实验:
trait Commontrait {
  val v:String  //抽象类型成员 在实例化的时候需要给出具体类型值
  def comfun():String = { v}
  def fun:Unit = {}
}
trait ConcretT1 extends Commontrait {
  override def comfun(): String = {
    println("ConcretT1 comfun....")
    super.comfun()
  }

  override def fun: Unit = {
    println("ConcretT1 fun....")
    super.fun
  }
}
trait ConcretT2 extends Commontrait {
  override def comfun(): String = {
    println("ConcretT2 comfun....")
    super.comfun()
  }
  override def fun: Unit = {
    println("ConcretT2 fun....")
    super.fun
  }
}
class CommonCls (override val v: String) extends ConcretT1 with ConcretT2
在main中:
val ccc = new CommonCls("hello")
println(ccc.comfun())
ccc.fun
显示如下:
ConcretT2 comfun....
ConcretT1 comfun....
hello
ConcretT2 fun....
ConcretT1 fun....
不管调用链中使用的方法有没有返回值,都会按从右到左执行方法。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-3 19:31 , Processed in 0.016723 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表