【问题标题】:scala: override implicit var in constructor, in both parent class and child class?scala:在父类和子类中覆盖构造函数中的隐式var?
【发布时间】:2011-10-13 04:10:12
【问题描述】:

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

使 Parent 隐含一个 var 并将其设置为新值成功地覆盖了 parent 中的隐式,而不是 child。

(这类似于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

有什么方法可以得到想要的行为?做一些事情,比如让 Parent 和 Child 都隐式成为一个 var 似乎不起作用。谢谢!

【问题讨论】:

    标签: scala


    【解决方案1】:

    你可以

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

    如果您真的不需要隐式类参数。我假设你会这样做。

    另一种方法是将隐式放在伴随对象上。像这样:

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

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2017-11-10
      • 2018-03-15
      相关资源
      最近更新 更多