Solidity Tutorial: Alles über Verträge – Jean Cvllr

Free Bitcoins: FreeBitcoin | BonusBitcoin

Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining


Bevor wir über das Überschreiben von Funktionen sprechen, sollten wir zunächst die Grundlagen von Funktionsaufrufen im Zusammenhang mit der Vererbung von Verträgen verstehen.

Wir werden unseren vorherigen Vererbungsgraphen von wiederverwenden Person -> Mitarbeiter -> Lehrer und schreiben Sie einige Funktionen.

Einführung

NB: Die ersten Codebeispiele sind nur eine grundlegende Einführung, um einen Überblick auf hoher Ebene zu erhalten. Sie gelten nur für Solidity 0.5.0.
Für 0.6.0 können Sie sich den nächsten Abschnitt mit dem Titel ansehen "Virtuelle und überschreibende Schlüsselwörter"

Schreiben wir die erste Funktion innerhalb der Person Vertrag.

Pragma-Solidität ^ 0,6,0;Vertragsperson {

Funktion greetings () public pure gibt zurück (String-Speicher) {
return "Hallo";
}}

}}

Das Mitarbeiter Vertrag erbt direkt diese Funktion. Aber was ist, wenn Sie die Begrüßungsnachricht an den Mitarbeiter anpassen möchten?

Wenn der Mitarbeiter in einer Kundendienstabteilung arbeitet, sollte die Nachricht an das angepasst werden, was einem Kunden gesagt werden soll "Hallo. Womit kann ich Ihnen behilflich sein?".

Wir haben bereits gesehen, dass das Überschreiben von Funktionen dies einfach ermöglicht.

Pragma-Solidität ^ 0,5,0;Vertragsperson {

Funktion greetings () public pure gibt zurück (String-Speicher) {
return "Hallo";
}}

}}Vertrag Mitarbeiter ist Person {

Funktion greetings () public pure gibt zurück (String-Speicher) {
return "Hallo. Wie kann ich dir helfen? :)";
}}

}}

So weit, ist es gut. Schauen wir uns jedoch das folgende Beispiel an. Durch einen Anruf sag Hallo()`, welche Nachricht solltest du erhalten? "Hallo", oder "Hallo, wie kann ich Ihnen helfen?" ?

Pragma-Solidität ^ 0,5,0;Vertragsperson {

Funktion greetings () public pure gibt zurück (String-Speicher) {
return "Hallo";
}}

}}Vertrag Mitarbeiter ist Person {

Funktion greetings () public pure gibt zurück (String-Speicher) {
return "Hallo. Wie kann ich dir helfen? :)";
}}

}}

Vertrag Lehrer ist Person, Mitarbeiter {

Funktion sayHello () public pure gibt zurück (String-Speicher) {
Schöne Grüße();
}}
}}

Diejenigen, die mit Polymorphismus vertraut sind, werden sagen " Hallo, wie kann ich Ihnen helfen? :) . Eine ausführlichere Erklärung finden Sie jedoch in der Solidity-Dokumentation:

Wenn eine Funktion aufgerufen wird, die in verschiedenen Verträgen mehrfach definiert ist, Die angegebenen Basen werden von rechts nach links durchsucht in der Tiefe zuerst, beim ersten Spiel zu stoppen.

Wenn ein Basisvertrag bereits durchsucht wurde, wird er übersprungen.

Polymorphismus bedeutet, dass ein Funktionsaufruf (intern und extern) immer die gleichnamige Funktion (und Parametertypen) ausführt. im am meisten abgeleiteten Vertrag in der Vererbungshierarchie.

Dies ist die Basis von Funktion überschreiben.

Virtuelles und überschriebenes Schlüsselwort

Seit Solidity 0.6.0 müssen überschreibende Funktionen explizit angegeben werden. Jede gleichnamige Funktion der Vererbungshierarchie muss definiert werden mit:

  • das virtuell Schlüsselwort, um das Überschreiben in zukünftigen Verträgen zu ermöglichen
  • das überschreiben Schlüsselwort, um anzugeben, dass die Funktion überschrieben wird

Lassen Sie uns unseren vorherigen Beispielvertrag neu schreiben und auf Version 0.6.0 aktualisieren.

Pragma-Solidität ^ 0,6,0;Vertragsperson {

Funktion greetings () public pure virtuell Rückgabe (String-Speicher) {
return "Hallo";
}}

}}

Vertrag Mitarbeiter ist Person {

Funktion greetings () public pure virtuelle Überschreibung Rückgabe (String-Speicher) {
return "Hallo. Wie kann ich dir helfen? :)";
}}

}}

Das Schöne Grüße Funktion in unserem Person Vertrag enthält die virtuell Stichwort. Es bedeutet, dass es sein kann überschrieben.

Das Schöne Grüße Funktion in unserem Mitarbeiter Vertrag enthält sowohl die virtuell und überschreiben Stichwort. Dies bedeutet, dass 1) es wurde überschrieben das Schöne Grüße() Funktion und 2) es kann wieder überschrieben werden in zukünftigen Verträgen, die es erben.

Die einzige „Belastung“ besteht darin, dass Sie alle überschriebenen Verträge zwischen Klammern wie folgt angeben müssen:

Vertrag Lehrer ist Person, Mitarbeiter {

Funktion greetings () public pure überschreiben (Mitarbeiter, Person) Rückgabe (String-Speicher) {
return "Hallo Schüler! Willkommen bei 'All About Solidity'";
}}

}}

Was ist, wenn nur ein Schlüsselwort angegeben wird?

  • nur virtuell : Zukünftige abgeleitete Verträge können das Verhalten dieser Funktion ändern.
  • nur überschreiben : Sie überschreiben eine Funktion aus einem Basisvertrag, können sie jedoch in zukünftigen abgeleiteten Verträgen nicht überschreiben.

Bei Mehrfachvererbung müssen die am häufigsten abgeleiteten Basisverträge, die dieselbe Funktion definieren, explizit nach dem angegeben werden überschreiben Stichwort.

Mit anderen Worten, Sie müssen alle Basisverträge angeben, die dieselbe Funktion definieren und noch nicht von einem anderen Basisvertrag überschrieben wurden (auf einem Pfad durch das Vererbungsdiagramm).

Wenn ein Vertrag dieselbe Funktion von mehreren (nicht verwandten) Basen erbt, muss er diese außerdem explizit überschreiben:

NB: Funktioniert mit dem Privat Sichtbarkeit kann nicht sein virtuell.

NB2: Funktionen ohne Implementierung müssen markiert werden virtuell außerhalb von Schnittstellen.

Externe Funktionen mit öffentlichen Variablen überschreiben

Öffentliche Statusvariablen können Funktionen nur überschreiben, wenn:

  • Die Funktion ist mit dem gekennzeichnet extern Sichtweite.
  • Der Rückgabetyp der Funktion entspricht dem Typ der als deklarierten Variablen Öffentlichkeit.
Pragma Solidität > = 0,5,0 <0,7,0;Vertrag EIN
{
Funktion f () extern rein virtuell kehrt zurück(uint) { Rückkehr 5; }}
}}
Vertrag B. ist EIN
{
uint Öffentlichkeit überschreiben f;
}}

Die einzige Einschränkung ist dieÖffentlichkeit Variablen (f in unserem Beispiel) kann aber überschreiben kann nicht überschrieben werden.

Mit anderen Worten, solche Variablen können nicht als markiert werden virtuell.

Free Bitcoins: FreeBitcoin | BonusBitcoin

Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close