Solidez – Constructores

Un constructor es un método especial en cualquier lenguaje de programación orientado a objetos que se llama cada vez que se inicializa un objeto de una clase. Es totalmente diferente en el caso de Solidity, Solidity proporciona una declaración de constructor dentro del contrato inteligente y se invoca solo una vez cuando se implementa el contrato y se usa para inicializar el estado del contrato. El compilador crea un constructor predeterminado si no hay un constructor definido explícitamente.

Creando un constructor

Un constructor se define utilizando una palabra clave de constructor sin ningún nombre de función seguido de un modificador de acceso. Es una función opcional que inicializa las variables de estado del contrato. Un constructor puede ser interno o público, un constructor interno marca el contrato como abstracto. 

Sintaxis:

constructor() <Access Modifier> {          
} 

Ejemplo: en el siguiente ejemplo, en el contrato constructorExample , se crea un constructor para inicializar la variable de estado str. 

Solidity

// Solidity program to demonstrate
// creating a constructor
pragma solidity ^0.5.0;       
         
// Creating a contract
contract constructorExample {       
         
    // Declaring state variable
    string str;       
             
    // Creating a constructor
    // to set value of 'str'
    constructor() public {                 
        str = "GeeksForGeeks";       
    }       
      
    // Defining function to
    // return the value of 'str' 
    function getValue(
    ) public view returns (
      string memory) {       
        return str;       
    }     
}

Producción : 

Creating Constructor

Constructor en Herencia

En caso de que no se defina un constructor, se llama al constructor predeterminado, pero si el constructor está definido en un contrato principal y tiene algunos argumentos, entonces el contrato secundario también debe proporcionar los parámetros necesarios para el constructor. Si el contrato hijo no pasa ningún parámetro al constructor del padre, el contrato hijo se convertirá en un contrato abstracto. Hay dos formas de llamar al constructor de un contrato principal: 

1. Inicialización directa: en el siguiente ejemplo, el método de inicialización directa se usa para inicializar el constructor de la clase principal.

Solidity

// Solidity program to demonstrate
// Constructor in Inheritance
pragma solidity ^0.5.0;
 
// Creating a contract
contract Base {
 
   // Declaring variable
   uint data;
 
   // Defining a constructor
   constructor(uint _data) public {
      data = _data;  
   }
 
   // Defining function
   function Print(
   ) public  returns(string memory){
       return "Direct Initialization";
   }
 
}
 
// Child contract inheriting
// the parent contract 'Base'
contract Derived is Base(2){
 
    // Defining a constructor
    constructor() public {}
 
   // Defining function to access
   // variable of parent contract
   function getData(
   ) external returns(uint){
       uint result = data ** 2;
       return result;
   }
}
 
// Caller contract
contract caller{
 
   // Creating an object of child contract
    Derived c = new Derived();
 
   // Accessing functions of parent
   // and child contract using
   // object of child contract
    function getResult() public returns(uint){
        c.Print();
        return c.getData();
    }
}

Producción : 
 

Direct Initialization

2. Inicialización indirecta: en el siguiente ejemplo, la inicialización indirecta usando Base(string(abi.encodePacked(_info, _info))) se realiza para inicializar el constructor de la clase base.

Solidity

// Solidity program to demonstrate
// Indirect Initialization
pragma solidity ^0.5.0;
 
// Creating a contract
contract Base {
 
   // Declaring state variable
   string str;
 
   // Defining a constructor
   constructor(
     string memory _str) public {
      str = _str;  
   }
 
   // Defining a function
   function Print(
   ) public returns(string memory){
       return "Indirect Initialization";
   }
}
 
// Child contract inheriting
// parent contract 'Base'
contract Derived is Base {
 
   // Defining a constructor
   constructor(
     string memory _info) Base(
     string(abi.encodePacked(
       _info, _info))) public {}
 
   // Defining function to
   // return value of parent
   // contract variable 'str'
   function getStr(
   ) public view returns(string memory){
       return str;
   }
}
 
// Caller contract
contract caller {
 
    // Creating an object of
    // child contract
    Derived c
      = new Derived("GeeksForGeeks");
 
    //Defining a function to access
    // functions of the parent
    //contract and child contract
    function getResult() public view{
        c.Print();
        c.getStr();
    }
}

Producción : 

Indirect Initialization

Necesidad de Constructores

Los constructores son muy útiles en un contrato inteligente, se puede definir un valor de parámetro en el tiempo de ejecución y también se puede restringir la llamada al método. La sobrecarga de constructores no es compatible con Solidity, solo permite un constructor a la vez.

Ejemplo: en el siguiente ejemplo, el contrato constructorExample consta de un constructor para demostrar la necesidad del constructor.

Solidity

// Solidity program to demonstrate
// Need of constructors
pragma solidity ^0.5.0;       
         
// Creating a contract
contract constructorExample {       
         
    // Declaring state variable
    string str;       
    address private owner
      = 0x62Ab98A0efB752C48bd82836D0b4335018B9B97e;
 
    // Defining constructor
    constructor(string memory string) public {                 
        if(msg.sender == owner){   
            str = string;   
        }       
    }       
     
    // Defining function to
    // return value of 'str'  
    function getValue() public view returns (
      string memory) {       
        return str;       
    }     
}

Producción : 

Need for Constructors

Publicación traducida automáticamente

Artículo escrito por jeeteshgavande30 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *