Способ улучшить класс с делегированием функции - PullRequest
5 голосов
/ 24 апреля 2019

У меня есть следующие классы в Scala:

class A {
    def doSomething() = ???

    def doOtherThing() = ???
}

class B {
    val a: A

    // need to enhance the class with both two functions doSomething() and doOtherThing() that delegates to A
    // def doSomething() = a.toDomething()
    // def doOtherThing() = a.doOtherThing()
}

Мне нужен способ улучшить класс B во время компиляции теми же сигнатурами функций, что и A, которые просто делегируются A при вызове B.

Есть ли хороший способ сделать это в Scala?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 24 апреля 2019

В Dotty (и в будущем Scala 3) это теперь доступно просто как

class B {
    val a: A

    export a
}

или export a.{doSomething, doOtherThing}.

Для Scala 2, к сожалению, нет встроенного решения. Как говорит Тим, вы можете сделать это, но вам нужно решить, сколько усилий вы готовы потратить и что именно поддержать.

4 голосов
/ 24 апреля 2019

Неявное преобразование может использоваться для делегирования, например,

object Hello extends App {
  class A {
    def doSomething() = "A.doSomething"
    def doOtherThing() = "A.doOtherThing"
  }

  class B {
    val a: A = new A
  }

  implicit def delegateToA(b: B): A = b.a
  val b = new B
  b.doSomething() // A.doSomething
}
4 голосов
/ 24 апреля 2019

Вы можете избежать повторения сигнатур функций, создав псевдоним для каждой функции:

val doSomething = a.doSomething _
val doOtherthing = a.doOtherThing _

Однако теперь это функциональные значения, а не методы, которые могут или не могут иметь значение в зависимости от использования.

Возможно, можно использовать trait или решение на основе макросов, но это зависит от деталей того, почему используется делегирование.

...