Supponiamo che io ho il seguente codice:contrastanti tratti ereditari annidati
trait Trait1 {
trait Inner {
val name = "Inner1"
}
}
trait Trait2 {
trait Inner {
val name = "Inner2"
}
}
class Foo extends Trait1 with Trait2 {
// I want Concrete1 to be a Trait1.Inner not a Trait2.Inner
class Concrete1 extends Inner
val c = new Concrete1
}
object Obj {
def main(args: Array[String]): Unit = {
val foo = new Foo
println(foo.c.name)
}
}
Quando mescolo in Trait1
e Trait2
, riferendosi a Inner
sembra di default al Inner
tipo di qualsiasi caratteristica I mixin secondo; quindi quando chiamo il metodo main
main
, stampa Inner2
. Come posso fare riferimento a Trait1.Inner
in Foo
? Tutti e tre i seguenti errori del compilatore sono riportati:
class Concrete1 extends Trait1.Inner
class Concrete1 extends Trait1$Inner
class Concrete1 extends Trait1#Inner
È grandioso, ora posso scrivere la classe Concrete1 estende super [Trait1] .Inner e class Concrete2 estende super [Trait2] .Inner e hanno istanze di entrambi i tipi di Inner in Foo. – ams