隐式类是否可以覆盖默认实现

问题描述 投票:1回答:1

说我定义以下内容:

class A {
    def foo() = println("A::foo")
}

implicit class Wrapper(a: A) {
    def foo() = println("Wrapper::foo")
    def bar() = println("Wrapper::bar")
}

val a = new A
a.foo()
a.bar()

A :: foo()是被调用的方法。隐式类有什么方法可以覆盖A中的默认实现吗?

scala implicit
1个回答
0
投票

如果存在成员方法,则编译器would not search for implicit。如果不能通过继承进行覆盖,则可以考虑“翻转表”并创建一个delegate,如下所示

class A {
  def foo() = println("A::foo")
  def zar() = println("A::zar")
}

class Wrapper(val a: A) {
  def foo() = println("Wrapper::foo")
  def bar() = println("Wrapper::bar")
}

implicit def unwrap(wrapped: Wrapper): A = wrapped.a

val a = new Wrapper(new A)
a.zar()   // A::zar
a.foo()   // Wrapper::foo
a.bar()   // Wrapper::bar
© www.soinside.com 2019 - 2024. All rights reserved.