En kotlin existe el patrón ' Decorar por Delegación '. ¿Hay alguna manera de lograrlo de manera elegante en Scala?
Aquí hay un ejemplo de código kotlin:
interface Doo{ fun a(): Unit fun b(): Unit } class Goo:Doo { override fun a() { println("goo a") } override fun b() { println("goo b") } } class Moo(doo: Doo):Doo by doo{ override fun b() { println("mooooooo") } } fun main() { val m = Moo(Goo()) ma();mb() }En Scala 2, por lo que sé, no puedes lograr esto. Sin embargo, es posible en Scala 3 con export :
trait Foo { def a: Int def b: String } trait Bar { def a: Int } def decorateAsFoo(bar: Bar): Foo = new Foo { export bar._ // export all bar methods/values/types in this Foo impl override def b: String = "decorated" } decorateFoo(new Bar { override def a: Int = 10 })(Ver scastie )
Como puede ver con export , ni siquiera tiene que crear una class nombres separada (aunque podría hacerlo si lo desea) ni tiene que tener ningún tipo de relación de subtipificación entre el decorador y el decorado, siempre que el resultado tenga todos las definiciones necesarias exportadas o implementadas manualmente.
En Scala 2 (que yo sepa), lo mejor con lo que puede contar es la conversión de un tipo de datos a otro tipo de datos con un esquema similar, a través de bibliotecas como Chimney . Sin embargo, no conozco ninguna biblioteca que realice dicha conversión entre clases que almacenan el comportamiento.