Есть ли способ, которым неявный класс может переопределить реализацию по умолчанию - PullRequest
4 голосов
/ 25 января 2020

Скажем, я определяю следующее:

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 Ответ

4 голосов
/ 25 января 2020

Если существует метод-член, компилятор не будет искать неявный . Если переопределение с наследованием не является опцией, вы можете рассмотреть возможность «переворачивания таблиц» и создать делегат примерно так

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