W szczególnym przypadku, gdy występują konflikty nazw, pojawi się błąd czasu kompilacji. Zakładając D
jest klasa wykonawcze:
class D extends A with C with B
def main(args: Array[String]): Unit = {
val d = new D
println(d.print())
}
Zobaczysz:
Error:(25, 9) class D inherits conflicting members:
method print in trait B of type()Unit and
method print in trait C of type()Unit
(Note: this can be resolved by declaring an override in class D.)
class D extends A with B with C
Jeśli jednak pomóc kompilator dodając override print()
do D
i uczynić go nazwać super.print()
będzie drukować ostatnia cecha w Linage które obsługują print
metody, a mianowicie:
trait A { }
trait B { def print() = println("hello") }
trait C { def print() = println("world") }
class D extends A with B with C {
override def print(): Unit = super.print()
}
Chcemy dostać „świat” . Jeśli mamy włączony B
i C
:
class D extends A with C with B {
override def print(): Unit = super.print()
}
Chcemy dostać "cześć".
Dodałbym, że możesz być jednoznaczny: 'klasa D rozszerza A na B z C {przesuń def print(): Jednostka = super [B] .print()} '. –