Mehrfachvererbung und Linearisierung

Hallo an alle. Ich betrachte Mehrfachvererbung in Solidity. Ich bin in ihrer Dokumentation auf dieses Beispiel gestoßen, aber es ist für mich nicht verständlich genug.

Kann jemand diesen Satz genauer erklären:

Der Grund dafür ist, dass C X auffordert, A zu überschreiben (indem A, X in dieser Reihenfolge angegeben werden), aber A selbst anfordert, X zu überschreiben, was ein Widerspruch ist, der nicht aufgelöst werden kann.

Meine Frage ist, warum C X auffordert, A zu überschreiben, dh was diese Vererbungsreihenfolge genau bedeutet?

    pragma solidity ^0.4.0;

     contract X {}
     contract A is X {}
     contract C is A, X {}

Antworten (2)

Nach Recherche fand ich:

Bei Mehrfachvererbung gibt es ein Problem, das durch das Diamond-Problem verursacht wird. Solidity löst dieses Problem wie Python.

Hier sind zwei Links, die dieses Problem im Detail beschreiben: https://docs.python.org/2/tutorial/classes.html#instance-objects https://www.python.org/download/releases/2.3/mro/

Die Reihenfolge der Vererbung ist also wichtig, um das Diamond-Problem zu vermeiden. Die Reihenfolge sollte sein: von Klassen auf der obersten Vererbungsebene zu den Klassen auf niedrigeren Ebenen

Der Vollständigkeit halber Link zur solidity-Dokumentation solidity.readthedocs.io/en/develop/…
Nur eine kleine Beobachtung, um Fallstricke zu vermeiden: In Python werden die Basisklassen von links nach rechts durchsucht. In Solidity ist von rechts nach links.

Am besten erklärt in den Solidity-Dokumenten zu Mehrfachvererbung und Linearisierung :

Sie müssen die direkten Basisverträge in der Reihenfolge von „am meisten basisähnlich“ bis „am meisten abgeleitet“ auflisten. Beachten Sie, dass diese Reihenfolge umgekehrt zu der in Python verwendeten ist.

Eine andere vereinfachende Art, dies zu erklären, besteht darin, dass beim Aufruf einer Funktion, die mehrmals in verschiedenen Verträgen definiert ist, die angegebenen Basen von rechts nach links (von links nach rechts in Python) in der Tiefe zuerst durchsucht werden, wobei beim ersten Treffer angehalten wird . Wenn bereits ein Basisvertrag gesucht wurde, wird dieser übersprungen.