В случае, когда у вас возникли конфликты имен, вы получите ошибку времени компиляции. Предполагая, что D
является класс реализации:
class D extends A with C with B
def main(args: Array[String]): Unit = {
val d = new D
println(d.print())
}
Вы увидите:
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
Однако, если мы помочь компилятору путем добавления override print()
к D
, и сделать его называют super.print()
, он будет печатать последняя черта в построчной оплате, которая поддерживает print
метод, то есть:
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()
}
Мы получили бы «мир» , Если мы перешли B
и C
:
class D extends A with C with B {
override def print(): Unit = super.print()
}
Мы получили бы "привет".
Я бы добавил, что вы можете быть явным: 'class D расширяет A с B с помощью C {переопределить def print(): Unit = super [B] .print()} '. –