加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala:如何包装子类构造函数的执行?

发布时间:2020-12-16 10:01:45 所属栏目:安全 来源:网络整理
导读:在 scala中,我有一个基类和一些子类.在不向子类添加代码或更改子类的实例化的情况下,我希望基类能够在子构造函数执行之前和之后调用某些代码.之前很容易,因为基类构造函数在子项之前被调用,但我没有看到处理后案例的方法.作为一些示例代码: class A { // do
在 scala中,我有一个基类和一些子类.在不向子类添加代码或更改子类的实例化的情况下,我希望基类能够在子构造函数执行之前和之后调用某些代码.之前很容易,因为基类构造函数在子项之前被调用,但我没有看到处理后案例的方法.作为一些示例代码:

class A {
  // do some stuff before child constructor is called
  // ...

  // do some other stuff after child constructor is called
  // this could be a method or inline in the constructor,doesn't matter.
}    

class B extends A { // stuff happens in between }

class C extends A { // stuff happens in between }
etc 

val b = new B // everything happens inside,no other method call needed

这种行为可能吗?谢谢.

解决方法

如果您使用Scala 2.9,您可以安排以下内容:

class A { 
  println("Hi")
}
class B extends A with DelayedInit {
  private[this] var count = 0
  println("Hey")
  def delayedInit(x: => Unit) {
    x
    count += 1
    if (count==2) { println("There") }
  }
}
class C extends B { println("Ho") }
class D extends C { println("Ha") }

这利用了新的DelayedInit特性,它将延迟的构造函数从当前和所有子类发送到delayedInit方法.不幸的是,由于没有终止信号,你只能跳过一个构造函数.所以对于C,我们得到:

scala> new C
Hi
Hey
Ho
There

其中“There”块在C的“Ho”块之后神奇地出现了.不幸的是,如果扩展C,新的初始化最后发生:

scala> new D
Hi
Hey
Ho
There
Ha

(你真的不需要A那里……我只是把它放在那里来说明超类会发生什么.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读