Lassen Sie uns sagen, ich habe den folgenden Code, wo ich hybride Wesen erlauben und weil jemand Arten mischen kann (zB haben nur reine Menschen oder reine Aliens), würde ich gerne eine Methode haben, dass Stacking Traits und abstrakte Klassen mit Overrides
trait Person {
def say(): Unit
}
trait Human {
def say(): Unit = println("Hi, I am a human")
}
trait Dude extends Human {
override def say(): Unit = {
super.say()
println("Duuude!")
}
}
abstract class Alien(msg: String) extends Person {
def say(): Unit = println(s"Hi, I'm an alien: $msg")
}
class Hybrid(name: String) extends Alien("bleep") with Dude // does not work!
val someone = new Hybrid("John")
someone.say()
Dies gilt nicht kompilieren, weil:
error: overriding method say in class Alien of type()Unit;
method say in trait Dude of type()Unit cannot override a concrete member without a third member that's overridden by both (...)
ist es möglich, haben someone.say() zeigen folgende, die say
genannt wird ‚eingemischt‘, erklärt, was ist?
Hi, I'm am a human
Duuude!
Hi, I'm an alien: bleep
Ich habe daran gedacht, ein Sonderklasse zu schaffen, die in beiden Zügen/Klassen mischen schon, aber wie würde ich mich dann über die jeweiligen say
Methoden zugreifen, wie offensichtlich super.say
mehrdeutig sein.
Sie haben widersprüchlichen Methoden in Ihrer Implementierung. Was Sie erreichen wollen, ist absolut machbar, aber Sie müssen ein besseres Vererbungsmodell einführen, da dasjenige, das Sie jetzt haben, einfach nicht zusammengesetzt wird. Du könntest mit Alexeys Antwort gehen, die tun wird, was du willst, aber es löst nicht die schlechte Struktur. – sebszyller
Duplikate http://Stackoverflow.com/q/17500342/1296806 –