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.