Lassen Sie mich meine Beobachtung in scala über multiple Vererbung erklären -Mehrfachvererbung nicht für Klasse/abstrakte Klasse unterstützt, aber für Merkmal in scala unterstützt. Warum?
Mehrfache Vererbung ist nicht in Scala für Klassen möglich. Ich kann verstehen, diese zu „Diamant Problem“ zurückzuführen ist http://stackoverflow.com/questions/2064880/diamond-problem
so unter Code nicht
class High {
def confuse(){
println("High::I will confuse you later")
}
}
class MiddleLeft extends High {
override def confuse(){
println("MiddleLeft::I will confuse you later")
}
}
class MiddleRight extends High{
override def confuse(){
println("MiddleRight::I will confuse you later")
}
}
// Below code does not compile
class LowLeft extends MiddleRight with MiddleLeft{
def calConfuse(){
confuse()
}
}
Jetzt haben könnten Züge konkrete Klassen nicht kompiliert. Aber es unterstützt Mehrfachvererbung, weil Reihenfolge, in den Zügen erweitert werden spielt eine Rolle, die das Diamant-Problem zu lösen, so unten Code funktioniert
trait High {
def confuse(){
println("High::I will confuse you later")
}
}
trait MiddleLeft extends High {
override def confuse(){
println("MiddleLeft::I will confuse you later")
}
}
trait MiddleRight extends High{
override def confuse(){
println("MiddleRight::I will confuse you later")
}
}
class LowLeft extends MiddleRight with MiddleLeft{
def calConfuse(){
confuse()
}
}
class LowRight extends MiddleLeft with MiddleRight{
def calConfuse(){
confuse()
}
}
object ConfuseTester extends App{
val lowLeft:LowLeft=new LowLeft()
lowLeft.confuse() //prints>>>MiddleLeft::I will confuse you later
val lowRight:LowRight=new LowRight()
lowRight.confuse()//prints>>>MiddleRight::I will confuse you later
}
Meine Frage ist, warum die mehrfache Vererbung für Klassen nicht gleiche Strategie folgt wie Zug tut (Ordering wie diese erweitert werden)
Klassen haben Konstrukteure, Merkmale nicht. Es wäre in einigen Fällen unmöglich, beide Konstruktoren zu erfüllen. –
Eigenschaften können "Konstruktoren" (Initialisierer) in Dotty und Scala 2.12 haben. Wenn Sie sich die Einschränkungen anschauen, die Initialisierer im Vergleich zu Klassenkonstruktoren haben, können Sie Hinweise zu den Dingen erhalten, die bei der Mehrfachvererbung für Klassen brechen können. Aber eigentlich ist die Hauptsache: Mehrfachvererbung für Klassen hat eine spezifische Bedeutung, nämlich eine Klasse, die mehrere Oberklassen hat. Das ist nicht was Merkmal-Mixins tun: Merkmal-Mixins haben nur ein * Super-Porträt, sie wissen einfach nicht welches. Die Neudefinition der Klassen-Mehrfachvererbung, um dasselbe wie Merkmals-Mixins zu meinen, ist sicherlich ... –
... möglich, aber es wäre keine Klassen-Mehrfach-Vererbung mehr, es wäre Merkmals-Mixins, und die Klassen wären keine Klassen mehr, sie wären Merkmale oder Mixins und sie immer noch als Klassen zu bezeichnen, würde nur zu Verwirrung führen. Mit MI erscheint eine Klasse * einmal * im Vererbungsbaum (wirklich, eine DAG mit MI) und hat * multiple * Superklassen, ein Merkmal Mixin erscheint * mehrfach * im Vererbungsbaum und hat nur * ein * Supertrait (obwohl an jedem Punkt ein anderer erscheint. Die beiden sind genau zueinander dual. –