有没有一种方法可以隐式类覆盖默认实现

时间:2020-01-25 15:58:52

标签: scala implicit

说我定义以下内容:

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中的默认实现?

1 个答案:

答案 0 :(得分:4)

如果存在成员方法,则编译器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