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:
Example
. 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.
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
Henrique Barcelos
2.
Ich glaube, ich habe mich nicht klar ausgedrückt. Was ich wissen wollte war, ob esprotected
,private
,package
usw. Modifikatoren gibt und was ist der Standardwert, wenn ich keinen spezifiziere?Denis