2013-10-03 11 views

Odpowiedz

15

Obawiam się, że nie ma sposobu, aby to zrobić. Sposób super[A].work działa tylko wtedy, gdy A i B mają te same typy zwracania.

Rozważ to:

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 
5

Scala po prostu uniemożliwia mieszanie A i B razem, jeśli deklarują metodę o tej samej nazwie i niekompatybilnym podpisie.

6

Nie można tego zrobić.

Spójrz na ten kawałek kodu:

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

Nie ma mowy, że zarówno z tych linii może pracować:

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

Jeśli pozwoliliśmy taki kod do kompilowania, jeden z nich zadania będą musiały rzucić ClassCastException lub zawieść w inny sposób. Po prostu nie można rozwiązać takiego konfliktu.

Chyba trzeba obejść to z jakiejś formy przekazania, może coś takiego:

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

Nie można tego zrobić w Scala.

drodze do pracy wokół tego jest użycie cechy jako współpracowników

trait A { 
    def work = { "x" } 
} 

trait B { 
    def work = { 1 } 
} 

class C { 
    val a = new A { } 
    val b = new B { } 

    a.work 
    b.work 
}