No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Curso de Introducci贸n a Solidity

Curso de Introducci贸n a Solidity

Sebasti谩n Leonardo Perez

Sebasti谩n Leonardo Perez

Uso de la herencia en Solidity

17/21
Recursos

Aportes 16

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Hola, para aclarar que Solidity s铆 es un lenguaje orientado a objetos, en la documentaci贸n oficial lo definen as铆:

Solidity is an object-oriented, high-level language for implementing smart contracts. Smart contracts are programs which govern the behaviour of accounts within the Ethereum state.

Fuente: Documentaci贸n oficial

17 - Herencia

鈥淣o hay que reinvetar la rueda鈥

Utilizamos la Herencia para reutilizar codigo en nuevos contratos. Solidity no es POO, pero se comporta similar. Solidity es orientado a contratos. Identificaremos con la sentencia is. Si un contrato tiene un constructor con parametros, debemos indicar que valores debe tomar ese constructor para poder derivarse.

Entonces, se busca generar una relacion entre contratos para reutilizar el codigo mediante la Herencia. Por lo que la capacidad de agregar/modificar una funcion ya escrita en el contrato anterior nos sera de mucha utilidad.

Las funciones virtuales son funciones definidas para que se puedan reescrbir por las funciones override. Para esto debemos establecer una relacion de Herencia. Si una funcion virtual no define implementacion, el contrato se convierte en un contrato abstracto. Tambien hay contratos abstractos que usamos como moldes vacios para usar en futuros contratos.

Las interfaces no van a tener codigo. su funcion es indicarnos un comportamiento que queremos que tenga un contrato. Solo tiene declaraciones (definiciones de funciones) sin codigo.

  • super (sentencia) nos sirve para hacer referencia a una funcion de clase superior.

Ejemplo practico: Buscamos 2 funciones virtuales en Modificadores馃摋 e Interface馃摌 para colocar en nuestro archivo/contrato de Herencia 馃摃馃摌馃摋.

Vamos a tener que importar el directorio de los demas contratos, en este caso se encuentran en la misma carpeta los contratos. Coloco los emojis de libros para hacer referencia a un contrato, si hay varios libros es porque es una Herencia que contiene otros contratos.

  • Herencia.sol 馃摃馃摌馃摋
// SPDX-Licence-Identifier: UNLICENSED

pragma solidity >=0.7.0 < 0.9.0;

import "./Interface.sol";
import "./Modificadores.sol";

contract Herencia is Suma, Modificadores {

    constructor(string memory nombreNuevo) Modificadores(nombreNuevo) {

    }

    function sumar(uint numero1, uint numero2) public override EsOwner() view returns(uint) {
        return numero1 + numero2;
    }
}

Es buena practica traer todo el encabezado de la funcion de 鈥淚nterface鈥, por lo que es recomendable copiar y pegar 鈥渇unction sumar(uint numero1, uint numero2)鈥

  • Interface.sol 馃摌
// SPDX-Licence-Identifier: UNLICENSED

pragma solidity >=0.7.0 < 0.9.0;

interface Suma {

    function sumar(uint numero1, uint numero2) external returns (uint);
}
  • Modificadores.sol 馃摋
// SPDX-Licence-Identifier: UNLICENSED

pragma solidity >=0.4.0 < 0.9.0;

contract Modificadores {


    address private owner;
    string private nombreOwner;

    constructor(string memory nombre {
        owner = msg.sender;
        nombreOwner = nombre;
    }

    function Suma(uint numero1, uint numero2) public view EsOwner() returns (uint) {
        return numero1 + numero2;
    }

    modifier EsOwner() {
        if (msg.sender != owner) revert();
        _;
    }
}

Es muy importante comprender los conceptos de POO para poder sacarle el maximo provecho a solidity, recomiendo tomar cualquier curso de programaci贸n orientada a objetos en platzi para poder entenderlos a profundidad, o si no, el libro 鈥淎n谩lisis y Dise帽o Orientado a Objetos鈥 de Graady Booch.

Muy parecido a los conceptos de Java. Quien sabe de POO puede entender esto facilmente

Solidity es un lenguaje orientado a 鈥渃ontratos鈥.

Entiendo que el profesor quiere decir que Solidity NO es un lenguaje de programacion orientado objetos 鈥淭RADICIONAL鈥, en otros lenguajes el manejo de clases y objetos es practicamente la misma, pero solidity tiene ciertas diferencias, incluso en alguna documentacion oficial de solidity lo definen como orientado a objetos y en otra como orientado a contratos.

Las FUNCIONES dentro de las INTERFACES por Defecto (Default) son EXTERTERNAL (EXTERNAS) & VIRTUAL (VIRTUALES) aunque NO le pongamos la palabra VIRTUAL.

Ejemplos de usar 鈥渧irtual鈥 en una funci贸n:

    function sumar(uint numero1, uint numero2) virtual public{}

    function utterance() public virtual returns (bytes32);

Esta 煤ltima (utterance) exige anteponer 鈥渁bstract鈥 a la declaraci贸n del contrato y a esto es lo que se refiere el profe con Contrato Abstracto:

abstract contract Herencia is Suma, Modificadores("Abc") {

Buen铆sima clase, esto tiene un valor intr铆nseco muy grande ya que es sumamente utilizado en la creaci贸n de contratos.

RESUMEN CLASE 17:
HERENCIA

I.- HERENCIA

  • El concepto es similar al de la programaci贸n orientada a objetos y la identificaremos con la sentencia 鈥渋s鈥.

  • Si un contrato tienen un constructor con par谩metros debemos indicar qu茅 valores debe tomar ese constructor para poder derivarse.

II.- OVERRIDE

  • Podemos definir funciones de tipo 鈥渧irtual鈥 para indicar que pueden ser redefinidas en sus contratos derivados.

  • Cuando se redefine una funci贸n se debe indicar el tipo 鈥渙verride鈥 en su declaraci贸n.

  • Si una funci贸n virtual no define implementaci贸n, el contrato se convierte en un contrato abstracto.

III.- INTERFACES

  • Nos permiten definir el comportamiento que queremos que tenga un contrato.

  • Se implementa igual que la herencia de contratos.

  • Sus funciones no tienen implementaci贸n, solo encabezados.

IV.- SUPER

Podemos hacer referencia a alg煤n elemento o funci贸n de la clase superior por medio de la sentencia 鈥渟uper鈥.

REMIX:

Herencia.sol

// SPDX-License-Identifier: GLP-3.0

pragma solidity >=0.7.0 <0.9.0;

import "./Interface.sol";
import "./Modificadores.sol";

contract Herencia is Suma, Modificadores {

    constructor(string memory nombreNuevo) Modificadores(nombreNuevo) {
        
    }

    function sumar(uint numero1, uint numero2) public override esOwner() view returns(uint) {
        return numero1+numero2;
    }

}

Una Empresa es una serie de Contratos Comerciales de ahora en adelante y no se si para siempre, pero en futuro a corto y mediano plazo ser谩 una empresa su andamiaje central CORE o CPU una serie de Smartcontracts que SE HEREDAN por el esencial motivo de identidad, eficiencia, optimizaci贸n y seguridad.

Solo me queda decir, los quiero mucho Platzi

Un agradecimiento al profe Uruguayo, voy a migrar a ese pa铆s, que es el mejor de LATAM, siempre agradecido master.

Herencia

Es la habilidad de usar la l贸gica escrita en otros contratos en nuestro propio contrato. Se hace por medio de la palabra is:

@import program/example

contract MyProgram is example{}

Si un contrato tiene un constructor con par谩metros debemos indicar qu茅 valores debe tomar ese constructor para poder derivarse.
.

Override

Podemos definir funciones del tipo virtual para indicar que pueden ser redefinidas en sus contratos derivados.

Cuando se redefine una funci贸n se debe indicar el tipo override en su declaraci贸n.

Si una funci贸n no define implementaci贸n (esto es si la funci贸n est谩 vac铆a), el contrato se convierte en un contrato abstracto.
.

Interfaces

Nos permiten definir el comportamiento que queremos que tenga un contrato

Se implementa igual que la herencia de contratos.

Sus funciones no tienen implementaci贸n, solo encabezados.
.

Super

Podemos hacer referencia a alg煤n elemento o funci贸n de la clase superior por medio de la sentencia super.
.

Ejemplo

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

import "./Interface.sol";
import "./Modificadores.sol";

contract Herencia is Suma, Modificadores {
    constructor(string memory nombreNuevo) Modificadores(nombreNuevo) 
    }
    
    function sumar(uint numero1, uint numero2) public override EsOwner() view returns(uint) {
        return numero1 + numero2;
    }
    
}
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

interface Suma {
    function sumar(uint numero1, uint numero2) external returns (uint);
}
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Modificadores {
    address private owner;
    string private nombreOwner;
    
    constructor(string memory nombre) {
        owner = msg.sender;
        nombreOwner = nombre;
    }
    
    function Resta(uint numero1, uint numero2) public view EsOwner() returns (uint) {
        return numero1 - numero2;
    }
    
    modifier EsOwner() {
        if (msg.sender != owner) revert();
        _;
    }
    
}
No me queda muy claro para qu茅 sirven las interfaces, si lo unico que tienen es una funci贸n pero sin ninguna funcionalidad, por lo que pude ver en la clase

Solidity es un lenguaje de alto nivel orientado a objetos para implementar contratos inteligentes. Los contratos inteligentes son programas que rigen el comportamiento de las cuentas dentro del estado Ethereum.

Creo que para personas que conocen m谩s del entorno esto les servir铆a mucho para optimizar sus tiempos y c贸digos ya que solo hay que realizar algunas modificaciones馃

Excelente clase, muy entendible todo