Automatische Generierung des Konstruktors und Sichtbarkeit der Eigenschaften

Angenommen, ich habe Folgendes:

 contract Owned   { address owner ; 

     function  owned ()   { owner =  msg . sender ; 
     } modifier onlyOwner ()   { 
         if   ( msg . sender ==  owner )  _ } 
 } contract Example   is   Owned   { 
     function  doSomething ()   { 
         if   ( address ==   < some address here )   <statement> ; 
     } 
 } 

Das obige scheint zu funktionieren. Also nehme ich 2 Dinge an:

  1. Der Compiler generiert einen Standardkonstruktor für Example .
  2. Die address ist für untergeordnete Verträge standardmäßig sichtbar.

Was würde passieren, wenn der übergeordnete Konstruktor Argumente hätte und ich sie nicht explizit deklarieren würde?

Würde es sich wie Java-Klassen verhalten, die Konstruktorsignatur in das untergeordnete Element kopieren und mich daher dazu bringen, die Argumente beim Erstellen des Vertrags zu übergeben?

Oder würde es sich wie PHP-Klassen (ältere Klassen) verhalten und die Eigenschaft einfach nicht initialisieren?

Ungefähr 2. Ich habe festgestellt, dass es einen public Modifikator für Eigenschaften gibt, bin mir aber nicht sicher, wie das Auslassen eines solchen Modifikators standardmäßig funktioniert.

Antworten (1)

Gute Frage!

Untersuchen wir die Konstruktorvererbung:

Schauen wir uns das folgende Beispiel an:

 import   "dapple/test.sol" ; contract A { 
     bool  aHit ; 
     bool   public  aPublicHit ; 
     bool   public  aConstructorArg ; 
     bool  cHit ; 

     function  A ( bool  _aConstructorArg )   { aHit =   true ; aPublicHit =   true ; aConstructorArg =  _aConstructorArg ; 
     } 
 } contract B is  A ( true )   { 
     bool  bHit ; 
     bool   public  bConstructorArg ; 
     function  B ( bool  _bConstructorArg )   { bHit =   true ; bConstructorArg =  _bConstructorArg ; 
     } 
     function  checkA ()  returns ( bool )   { 
       return  aHit ; 
     } 
     function  checkB ()  returns ( bool )   { 
       return  bHit ; 
     } 
     function  checkC ()  returns ( bool )   { 
       return  cHit ; 
     } 
 } contract T is   Test   { 

   function  testConstructor ()   { B b =   new  B ( true ); 
     //@log constructor A called: `bool b.checkA()` 
     //@log constructor B called: `bool b.checkB()` 
     //@log controll call c: `bool b.checkC()` 
     //@log public call: `bool b.aPublicHit()` 
     //@log a constructor arguments recieved: `bool b.aConstructorArg()` 
     //@log b constructor arguments recieved: `bool b.bConstructorArg()` 
   } 

 } 

Wenn wir jetzt die testConstructor-Funktion mit dapple test --report wir die folgende Ausgabe:

  test constructor LOG :    constructor  A called :   true LOG :    constructor  B called :   true LOG :  controll call c :   false LOG :    public  call :   true LOG :  a constructor  arguments recieved :   true LOG :  b constructor  arguments recieved :   true 

Was würde passieren, wenn der übergeordnete Konstruktor Argumente hätte und ich sie nicht explizit deklarieren würde?

Im Fall:

 contract A {   function  A ( bool )   {   ...   }} contract B is  A {   ...   } 

Ihr Vertrag würde nicht instanziieren:

 Error :   Trying  to create an instance of an abstract  contract . B b =   new  B ( true ); 
           ^---^ 

Ungefähr 2. Ich habe festgestellt, dass es einen öffentlichen Modifikator für Eigenschaften gibt, bin mir aber nicht sicher, wie das Auslassen eines solchen Modifikators standardmäßig funktioniert.

Das öffentliche Schlüsselwort generiert eine Schnittstelle für den Zugriff auf die Eigenschaft von außerhalb des Vertrags. Ich hoffe, das obige Beispiel macht dies deutlich.

Wenn Sie mehr über die Vererbung erfahren möchten, empfehlen wir Ihnen, die folgenden Links zu lesen:

https://solidity.readthedocs.io/en/develop/contracts.html?highlight=inheritance#inheritance

https://solidity.readthedocs.io/en/develop/contracts.html?highlight=inheritance#arguments-for-base-constructors

Danke für die Antwort. Über 2. Ich glaube, ich habe mich nicht klar ausgedrückt. Was ich wissen wollte war, ob es protected , private , package usw. Modifikatoren gibt und was ist der Standardwert, wenn ich keinen spezifiziere?
Es gibt solche für Funktionen. Aber lesen Sie es selbst: github.com/ethereum/wiki/wiki/… github.com/ethereum/wiki/wiki/…