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 } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |