Wie führe ich einen Konstruktor aus einem geerbten Vertrag aus, der Argumente aus dem Konstruktor eines untergeordneten Vertrags entgegennimmt?

Ich schaue mir den Bancor Smart Token-Code an und habe festgestellt, dass beim Aufruf des SmartToken-Konstruktors anstelle der Stelle, an der Modifikatoren normalerweise hingehen, eine Deklaration der ERC20Token-Konstruktorfunktion vorhanden istERC20Token(_name, _symbol, _decimals)

Ich kann anscheinend keine Dokumentation oder Beiträge dazu finden, aber ich vermute, so würden Sie angeben, welche Konstruktoren aus übergeordneten Verträgen aufgerufen werden sollten, die ein Kind erben könnte?

Ich konnte die gleichen Effekte erzielen, indem ich die Smart-Token-Vertragserklärung von contract SmartToken is ISmartToken, Owned, ERC20Token, TokenHolderin geändert habecontract SmartToken is ISmartToken, Owned, ERC20Token("some name", "some symbol", 18), TokenHolder

Smart-Token-Konstruktorfunktion:

function SmartToken(string _name, string _symbol, uint8 _decimals)
    ERC20Token(_name, _symbol, _decimals)
{
    NewSmartToken(address(this));
}

ERC20-Token-Konstruktorfunktion:

function ERC20Token(string _name, string _symbol, uint8 _decimals) {
    require(bytes(_name).length > 0 && bytes(_symbol).length > 0); // validate input

    name = _name;
    symbol = _symbol;
    decimals = _decimals;
}

Antworten (1)

Es wird sehr gut in der solidity-Dokumentation Argumente für Basiskonstruktoren erklärt

Abgeleitete Verträge müssen alle für die Basiskonstruktoren erforderlichen Argumente bereitstellen. Dies kann auf zwei Arten erfolgen:

pragma solidity ^0.4.0;

contract Base {
    uint x;
    function Base(uint _x) public { x = _x; }
}

contract Derived is Base(7) {
    function Derived(uint _y) Base(_y * _y) public {
    }
}

Eine Möglichkeit ist direkt in der Vererbungsliste (ist Base(7)). Der andere liegt in der Art und Weise, wie ein Modifikator als Teil des Headers des abgeleiteten Konstruktors (Base(_y * _y)) aufgerufen würde.

Die erste Möglichkeit ist bequemer, wenn das Konstruktorargument eine Konstante ist und das Verhalten des Vertrags definiert oder beschreibt.

Der zweite Weg muss verwendet werden, wenn die Konstruktorargumente der Basis von denen des abgeleiteten Vertrags abhängen. Wenn, wie in diesem dummen Beispiel, beide Stellen verwendet werden, hat das Argument im Modifikator-Stil Vorrang.

Super, solide Erklärung, vielen Dank! Dieser dumme Code stammt leider aus dem Bancor-Repository XD