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

时间:2011-07-26 06:58:33

标签: scala

我有一个类,它接受一个隐式参数,该参数由类方法内部调用的函数使用。我希望能够覆盖该隐式参数,并让类及其继承的父类都引用同一个新的隐式对象。

使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

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

1 个答案:

答案 0 :(得分:1)

你可以

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 }
}