首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这段代码同时打印"initialization1“和"initialization2",而只打印一个doAction?

为什么这段代码同时打印"initialization1“和"initialization2",而只打印一个doAction?
EN

Stack Overflow用户
提问于 2016-02-21 14:21:16
回答 1查看 47关注 0票数 1
代码语言:javascript
复制
trait Action {
  def doAction
}

trait TBeforeAfter extends Action {
  abstract override def doAction: Unit = {
    println("Initialization")
    super.doAction 
    println("Destoryed")
  }
}

trait TBeforeAfter2 extends Action {
  abstract override def doAction: Unit = {
    println("Initialization2")
    super.doAction 
    println("Destoryed2")
  }
}

class Work extends Action {
  override def doAction = println("doAction")
}

object TraitLearning extends App {
  val work = new Work with TBeforeAfter with TBeforeAfter2
  work.doAction
}

成果产出:

代码语言:javascript
复制
Initialization2
Initialization
doAction
Destoryed
Destoryed2

有人能告诉我为什么只叫一次doAction而叫两次吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-21 14:51:36

这两个特征,Work和他们的doAction方法都被称为。调用链是这样执行的:

  1. work.doAction ->调用TBeforeAfter2.doAction,因为它是实例化图中的最后一次混合。
  2. TBeforeAfter2.doAction打印"Initialization2",并调用super.doAction,这是TBeforeAfter.doAction,是对象图中的下一个混音。
  3. TBeforeAfter.doAction打印“初始化”,并调用它的super,即Work
  4. Work.doAction打印"doAction",并返回
  5. TBeforeAfter.doAction打印“销毁”并返回到TBeforeAfter2
  6. TBeforeAfter2.doAction打印"Destroyed2“并返回,并结束调用链。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35537263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档