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

scala:在父类和子类中覆盖构造函数中的隐式var?

发布时间:2020-12-16 19:24:18 所属栏目:安全 来源:网络整理
导读:我有一个类,它接受一个隐式参数,该参数由类方法内部调用的函数使用.我希望能够覆盖该隐式参数,并让类及其继承的父类都引用同一个新的隐式对象. 使Parent隐式为var并将其设置为成功的新值将覆盖父级中的隐式,而不是子级. (这类似于scala: override implicit p
我有一个类,它接受一个隐式参数,该参数由类方法内部调用的函数使用.我希望能够覆盖该隐式参数,并让类及其继承的父类都引用同一个新的隐式对象.

使Parent隐式为var并将其设置为成功的新值将覆盖父级中的隐式,而不是子级.

(这类似于scala: override implicit parameter to constructor,除了增加的限制,覆盖影响子类和父类.)

例如:

def outside(implicit x: Boolean) {
  println(x)
}

class Parent(implicit var x: Boolean) {
  def setImplicit() {
    x = true
  }

  def callOutside {
    outside
  }
}

class Child(implicit x: Boolean) extends Parent {
  override def callOutside {
    outside
  }
}

然后:

scala> val a = new Parent()(false)
a: Parent = Parent@c351f6d

scala> a.callOutside
false

scala> a.setImplicit()

scala> a.callOutside
true // <-- sees the new implicit correctly


scala> val b = new Child()(false)
b: Child = Child@68331dd0

scala> b.callOutside
false

scala> b.setImplicit()

scala> b.callOutside
false // <-- wrong,desire "true" instead

有没有办法得到理想的行为?做像父和子一样隐式的变量似乎不起作用.谢谢!

解决方法

你可以

class Parent(x0: Boolean) {
  implicit var x = x0
  ...
}

如果你真的不需要隐式的class参数.我会假设你这样做.

一种替代方法是将隐含物放在伴侣物体上.像这样:

class Parent(x0: Boolean) {
  implicit var x = x0
  def setImplicit { x = true }
  def outsideCall { outside }
}
object Parent {
  def apply(implicit x: Boolean) = new Parent(x)
}

class Child(x0: Boolean) extends Parent(x0) {
  def callOutside { outside }
}
object Child {
  def apply(implicit x: Boolean) = new Child(x)
}

或者,您可以为Child创建一个私有主构造函数(以某种方式修饰,因此它与隐式不一致)并在辅助构造函数上使用隐式:

class Child private (b: Boolean,u: Unit) extends Parent()(b) {
  def this()(implicit x: Boolean) = this(x,())
  def callOutside { outside }
}

(编辑:李大同)

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

    推荐文章
      热点阅读