scala multiple-inheritance traits

En la herencia múltiple de Scala, ¿cómo resolver los métodos conflictivos con la misma firma pero diferente tipo de retorno?



multiple-inheritance traits (4)

Me temo que no hay manera de hacer eso. La forma super[A].work solo funciona si A y B tienen los mismos tipos de devolución.

Considera esto:

class D extends B .... val test: List[B] = List(new C(), new D()) test.map(b => b.work) //oops - C returns a String, D returns an Int

Considere el siguiente código:

trait A { def work = { "x" } } trait B { def work = { 1 } } class C extends A with B { override def work = super[A].work }

La clase C no se compilará en la escala 2.10, debido a que "el trabajo de método de anulación en el rasgo A del tipo => Cadena; el trabajo de método tiene un tipo incompatible".

¿Cómo elegir un método específico?


No puedes hacer eso en Scala.

La forma de solucionar esto es usar los rasgos como colaboradores.

trait A { def work = { "x" } } trait B { def work = { 1 } } class C { val a = new A { } val b = new B { } a.work b.work }


No puedes hacer eso.

Mira esta pieza de código:

val c = new C val a: A = c val b: B = c

No hay forma de que estas dos líneas puedan funcionar:

val s: String = a.work val i: Int = b.work

Si permitimos que dicho código se compile, una de estas asignaciones tendría que lanzar una ClassCastException o fallar de otra manera. Entonces, simplemente no es posible resolver tal conflicto.

Supongo que tienes que solucionar esto con algún tipo de delegación, tal vez algo como esto:

class C extends A { def toB = new B { //implement B methods by somehow delegating them to C instance } }


Scala simplemente evita que se mezclen A y B si declaran un método con el mismo nombre y firma incompatible.