Wenn er sagt, dass Scala die Mehrfachvererbung nicht unterstützt, bezieht er sich darauf, eine Methodenimplementierung mehrmals zu erben. Natürlich können Sie mehrere Interfaces / Merkmale in einer Klasse implementieren, und sie können sogar dieselbe Methode definieren, aber Sie erhalten keinen Konflikt zwischen den verschiedenen Implementierungen aufgrund der Merkmallinearisierung.
Wenn Sie eine Klasse C1
mit einer Methode f()
und eine Klasse C2
auch mit einer Methode haben f()
, bedeutet Mehrfachvererbung im Allgemeinen, dass Sie beide Implementierungen von irgendwie erben können f()
. Dies kann zu verschiedenen Problemen führen, die Scala dadurch löst, dass Sie nur von einer einzelnen Klasse erben lassen und bei mehreren Merkmalen eine Implementierung anhand der Reihenfolge der Merkmale auswählen.
Was Nothing
sind die Dinge wirklich einfach, weil nichts definiert keine Attribute oder Methoden hat. Sie können also keine Vererbungskonflikte haben. Aber ich gehe davon aus, dass der größte Teil Ihrer Überraschung auf einem anderen Verständnis der Mehrfachvererbung beruht.
Wenn Sie verstanden haben, dass die Linearisierung von Merkmalen die Mehrdeutigkeit der Vererbung effektiv beseitigt und wir das Erben von mehreren Merkmalen aus diesem Grund nicht als Mehrfachvererbung bezeichnen , sollten Sie in Ordnung sein.
Wie dies realisiert wird: Der Compiler ist letztendlich dafür verantwortlich. Weitere Informationen finden Sie in der Scala-Sprachspezifikation in Abschnitt 3.5.2, der unter anderem Folgendes enthält:
For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.
Mit anderen Worten, wenn Sie einen Compiler korrekt implementieren möchten, muss er nach Nothing
Spezifikation als Subtyp von allem behandelt werden. Aus offensichtlichen Gründen Nothing
gilt die Definition nicht für alle in das System geladenen Klassen. Die Relevanz der Definition Nothing
als Untertyp ist jedoch auf alle Stellen beschränkt, an denen die Untertypisierung relevant ist.
Ein wichtiger Punkt hierbei ist, dass es keine Instanz eines Typs Nothing
gibt. Daher ist seine Behandlung streng auf die Typprüfung beschränkt, die sich ausschließlich im Bereich des Compilers befindet.