Ошибка ремикса при запуске следующей унаследованной модели твердости

ОБНОВЛЕНО НИЖЕ: (Что сработало для меня)

При компиляции и запуске следующего кода в Remix. Когда я пытаюсь инициализировать Master с помощью _ownerName, я получаю следующую ошибку: «Этот контракт не реализует все функции и, следовательно, не может быть создан».

Я хотел создать новые контракты с клиентами, используя контракт CustomerTemplate.

pragma solidity ^0.4.11;


//------------------------------------------------------------------------------------ 
//----- Templates 
//----- 
//------------------------------------------------------------------------------------ 

contract CustomerTemplate {

    bytes32 public customerName;
    bytes32 public customerLoc;

    function CustomerTemplate (bytes32 _customerName, bytes32 _customerLoc)  {

        customerName    = _customerName;
        customerLoc     = _customerLoc;

    }

}

//------------------------------------------------------------------------------------ 
//----- Master 
//----- Initialize Customer Master with Customer Name and Total Budget
//------------------------------------------------------------------------------------ 

contract Master is CustomerTemplate{

    address public owner;
    bytes32 public ownerName;
    address[] newCustomers;

    modifier onlyByMaster()  {
        require(msg.sender == owner);
        _;
    }

    function Master (bytes32 _ownerName) {

        owner = msg.sender;
        ownerName = _ownerName;
    }

    function createCustomer (bytes32 _customerName, bytes32 _customerLoc) {

        address myCustomer = new CustomerTemplate(_customerName, _customerLoc);
        newCustomers.push(myCustomer);
    }

    function killContract() constant onlyByMaster {

        if (msg.sender == owner) selfdestruct(owner);

    }

}

(ОБНОВЛЕНИЕ) У меня сработало следующее:

pragma solidity ^0.4.15;


contract Template {

    bytes32  public custName;
    bytes32  public custLoc;
    address  public contractAddress;

    function Template () {

        custName            = "0xDEFAULT";
        custLoc             = "0xDEFAULT";
        contractAddress     = address(this);

    }

    function AssignCustomerAttributes (bytes32 _custName, bytes32 _custLoc)  
        returns (bool isSuccess) {

        custName    = _custName;
        custLoc     = _custLoc;

        contractAddress  = address(this);

        return true;

    }

}

//------------------------------------------------------------------------------------ 
//----- Master 
//----- Initialize Customer Master with Customer Name and Total Budget
//------------------------------------------------------------------------------------ 


pragma solidity ^0.4.15;


contract Template {

    bytes32  public custName;
    bytes32  public custLoc;
    address  public contractAddress;

    function Template () {

        custName            = "0xDEFAULT";
        custLoc             = "0xDEFAULT";
        contractAddress     = address(this);

    }

    function AssignCustomerAttributes (bytes32 _custName, bytes32 _custLoc)  
        returns (bool isSuccess) {

        custName    = _custName;
        custLoc     = _custLoc;

        contractAddress  = address(this);

        return true;

    }

}

//------------------------------------------------------------------------------------ 
//----- Master 
//----- Initialize Customer Master with Customer Name and Total Budget
//------------------------------------------------------------------------------------ 

contract Master {

    address  public     masterContractAddress;
    bytes32  public     masterName = "";
    Template    myCustTemp; 

    function Master () {

        masterContractAddress = address(this);

    }

    function updateOwnerName (bytes32 _masterName)  {

        masterName = _masterName;

    }

    function createCustomer (bytes32 _custName, bytes32 _custLoc)  returns (bool flag) {

        Template myCust = new Template();

        if (myCust.AssignCustomerAttributes(_custName, _custLoc)) {

            return true;

        } else return false;

    }


}
Я думаю, что главный конструктор должен предоставить все аргументы, необходимые родительскому классу.
Привет @AchalaDissanayake, спасибо за ваш вклад. Мне еще предстоит попробовать это. Я пытаюсь исправить другую проблему, прежде чем протестировать ее и предоставить свой отзыв. эфириум.stackexchange.com/questions/27167/…
круто, удачи в твоём деле :)
@AchalaDissanayake, я предоставил обновленный код, который у меня работал. Спасибо,
здорово, что у вас это работает, но я не вижу там наследования. ошибка исходного кода, который вы опубликовали, была связана с отсутствием аргументов при использовании наследования :)
@AchalaDissanayake, это правильно. Вероятно, это еще один способ сделать это. Моя цель состояла в том, чтобы создать фабрику контрактов, которая систематически создавала бы новые контракты.
Просто как предложение, я не думаю , что contractAddressэто необходимо. Нужно знать, contractAddressчтобы вызвать функцию получения. Если кто-то знает, почему они спрашивают?
@РобХитченс. Я согласен. Я пытался увидеть только что сгенерированный контракт от Мастера, чтобы убедиться, что он действительно создает новый контракт по новому адресу. Долгосрочный план состоит в том, чтобы взаимодействовать с новыми контрактами напрямую (автоматизированно) из механизма, который находится за пределами блокчейна Ethereum. Я новичок в блокчейне. Я предполагаю, что адрес является критическим элементом для доступа к Контракту и его элементам.

Ответы (2)

Вам необходимо предоставить все аргументы, необходимые для родительского класса. Из документов Solidity здесь ,

Производные контракты должны предоставлять все аргументы, необходимые для базовых конструкторов.

Таким образом, главный конструктор будет выглядеть так:

function Master (bytes32 _ownerName, bytes32 _loc) CustomerTemplate(_ownerName, _loc) {

    owner = msg.sender;
    ownerName = _ownerName;
}
Что делать, если в унаследованном контракте нет аргументов конструктора? Выполнение по- CustomerTemplate()прежнему выдает "Этот контракт не реализует все функции"

Я была такая же проблема. Это может произойти, если вы используете наследование.

Исправление довольно тривиальное. Рядом с кнопкой «Создать» в Remix (он же Browser-Solidity) есть раскрывающийся список. Вам просто нужно выбрать фактическую реализацию контракта для развертывания, а не интерфейс.