Error de remezcla al ejecutar el siguiente modelo de solidez heredado

ACTUALIZADO A CONTINUACIÓN: (Lo que funcionó para mí)

Mientras compila y ejecuta el siguiente código en Remix. Cuando intento inicializar Master con _ownerName, aparece el siguiente error "Este contrato no implementa todas las funciones y, por lo tanto, no se puede crear".

Quería crear nuevos contratos de cliente utilizando el contrato de plantilla de cliente

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);

    }

}

(ACTUALIZAR) Lo siguiente funcionó para mí:

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;

    }


}
Creo que el constructor maestro debe proporcionar todos los argumentos necesarios para la clase principal.
Hola @AchalaDissanayake, gracias por tu aporte. Todavía tengo que probarlo. Estoy tratando de solucionar otro problema antes de probar esto y proporcionar mis comentarios. ethereum.stackexchange.com/questions/27167/…
Genial, buena suerte con tus cosas :)
@AchalaDissanayake, proporcioné el código actualizado que funcionó para mí. Gracias,
genial que lo hayas hecho funcionar, pero no veo ninguna herencia allí. el error del código original que publicaste se debió a que faltaban argumentos mientras se usaba la herencia :)
@AchalaDissanayake, eso es correcto. Esta es probablemente otra forma de hacerlo. Mi objetivo era crear una fábrica de contratos que crearía nuevos contratos de forma sistemática.
Solo como sugerencia, no creo que contractAddresssea necesaria. Uno necesitaría saber el contractAddresspara invocar la función getter. Si uno sabe, ¿por qué pregunta?
@Rob Hitchens. Estoy de acuerdo. Estaba tratando de ver el Contrato recién generado del Maestro para validar que realmente está generando un nuevo contrato en una nueva dirección. El plan a largo plazo es interactuar con los nuevos contratos directamente (automatizado) desde un motor que reside fuera de la cadena de bloques de Ethereum. Soy nuevo en blockchain. Estoy asumiendo que la dirección es el elemento crítico para acceder al Contrato y sus elementos.

Respuestas (2)

Debe proporcionar todos los argumentos necesarios para la clase principal. De los documentos de solidez aquí ,

Los contratos derivados deben proporcionar todos los argumentos necesarios para los constructores básicos.

Entonces el constructor maestro se vería así,

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

    owner = msg.sender;
    ownerName = _ownerName;
}
¿Qué sucede si el contrato heredado no tiene argumentos de constructor? Haciendo CustomerTemplate()todavía arroja "Este contrato no implementa todas las funciones"

Tuve el mismo problema. Podría suceder si usa la herencia.

La solución es bastante trivial. Hay un menú desplegable cerca del botón "Crear" en Remix (también conocido como Browser-Solidity). Solo necesita seleccionar la implementación del contrato real para implementar, no la interfaz.