(Hinweis: Aus offensichtlichen Gründen habe ich im Titel 'error' anstelle von 'problem' verwendet.;)).
Ich habe ein paar grundlegende Lektüren zu Traits in Scala gemacht. Sie ähneln Interfaces in Java oder C #, ermöglichen jedoch die Standardimplementierung einer Methode.
Ich habe mich gefragt: Kann dies nicht den Fall des "Diamantenproblems" verursachen, weshalb viele Sprachen die Mehrfachvererbung überhaupt vermeiden?
Wenn ja, wie geht Scala damit um?
scala
multiple-inheritance
Aviv Cohn
quelle
quelle
Antworten:
Das Diamantproblem ist die Unfähigkeit, zu entscheiden, welche Implementierung der Methode gewählt werden soll. Scala löst dieses Problem, indem es definiert, welche Implementierung als Teil der Sprachspezifikationen ausgewählt werden soll ( lesen Sie den Teil über Scala in diesem Wikipedia-Artikel ).
Natürlich kann dieselbe Ordnungsdefinition auch bei der Klassenmehrfachvererbung verwendet werden. Warum also mit Merkmalen arbeiten?
Der Grund, warum IMO Konstruktoren sind. Konstruktoren haben einige Einschränkungen, die reguläre Methoden nicht haben - sie können nur einmal pro Objekt aufgerufen werden, sie müssen für jedes neue Objekt aufgerufen werden, und der Konstruktor einer untergeordneten Klasse muss den Konstruktor des übergeordneten Objekts als erste Anweisung aufrufen (die meisten Sprachen werden dies tun) tun Sie dies implizit für Sie, wenn Sie keine Parameter übergeben müssen.
Wenn B und C A und D B und C erben und die Konstruktoren von B und C den Konstruktor von A aufrufen, wird der Konstruktor von D den Konstruktor von A zweimal aufrufen. Definieren , welche Implementierungen zu wählen wie Scala hat mit Methoden werden hier nicht arbeiten , weil beide B und Konstrukteure des C genannt werden müssen.
Merkmale vermeiden dieses Problem, da sie keine Konstruktoren haben.
quelle
Scala vermeidet das Diamantproblem durch sogenannte "Merkmalslinearisierung". Grundsätzlich wird die Methodenimplementierung in den Merkmalen nachgeschlagen, die Sie von rechts nach links erweitern. Einfaches Beispiel:
Allerdings enthält die Liste der Merkmale, nach denen es sucht, möglicherweise mehr als die, die Sie explizit angegeben haben, da sie möglicherweise andere Merkmale erweitern. Eine ausführliche Erklärung finden Sie hier: Merkmale als stapelbare Modifikationen und ein vollständigeres Beispiel für die Linearisierung hier: Warum nicht Mehrfachvererbung?
Ich glaube in anderen Programmiersprachen wird dieses Verhalten manchmal als "Methodenauflösungsreihenfolge" oder "MRO" bezeichnet.
quelle