Herencia
La herencia es un principio fundamental de la programación orientada a objetos (OOP) que también se encuentra en Solidity. La herencia permite que un contrato herede propiedades y comportamientos (variables de estado y funciones) de uno o más contratos "padres", promoviendo así la reutilización de código y la creación de relaciones jerárquicas entre contratos.
Características de la Herencia en Solidity
Reutilización de Código: La herencia permite que los contratos inteligentes reutilicen el código de otros contratos. Esto no solo reduce la redundancia sino que también fomenta la práctica del principio DRY (Don't Repeat Yourself).
Jerarquía de Contratos: Solidity permite la creación de una jerarquía de contratos, donde un contrato hijo puede heredar de múltiples contratos padres, siguiendo un patrón de herencia múltiple.
Sobrescritura de Funciones: Los contratos hijos pueden sobrescribir funciones heredadas de sus contratos padres, lo que permite personalizar o extender la funcionalidad base. Para esto se utilizará el atributo
override
en la función.Modificadores de Visibilidad: Solidity usa modificadores de visibilidad (
public
,internal
,private
, yexternal
) para controlar el acceso a las funciones y variables de estado. Las reglas de visibilidad también aplican a los contratos heredados.
Ejemplo Básico de Herencia
En este ejemplo, Derived
hereda de Base
. Esto significa que Derived
tiene acceso a la variable data
y puede usar o sobrescribir la función setData
. En la función setData
sobrescrita, modificamos la implementación para sumar 10 al _data
antes de almacenarlo.
Herencia multinivel
La herencia multinivel es un concepto donde un contrato hereda de otro contrato, que a su vez hereda de otro, creando así una jerarquía de herencia "multinivel". Este patrón permite la construcción de relaciones jerárquicas complejas y la reutilización de código a través de varios niveles de contratos.
Aquí tienes un ejemplo de herencia multinivel en Solidity, que ilustra cómo un contrato puede heredar propiedades y comportamientos de varios contratos padres situados en diferentes niveles de la jerarquía:
Explicación del código:
Grandparent
: Este es el contrato de nivel base que define una variablegrandparentValue
y una funciónsetGrandparentValue
para modificarla. También tiene un constructor que inicializagrandparentValue
.Parent
: Este contrato hereda deGrandparent
. Añade su propia variableparentValue
y una funciónsetParentValue
para modificarla. Su constructor llama al constructor deGrandparent
para inicializargrandparentValue
, y también inicializaparentValue
.Child
: Este es el contrato de nivel más bajo que hereda deParent
(y, por lo tanto, indirectamente deGrandparent
). Añade una variablechildValue
y una funciónsetChildValue
. Su constructor inicializa las variables de todos los niveles de la jerarquía llamando al constructor deParent
, que a su vez llama al constructor deGrandparent
.
Este ejemplo muestra cómo se pueden crear y utilizar relaciones jerárquicas en Solidity mediante la herencia multinivel, permitiendo a los contratos hijos acceder y sobrescribir propiedades y funciones de sus ancestros, promoviendo la reutilización y la modularidad del código.
Herencia jerárquica
La herencia jerárquica en Solidity se refiere a un patrón donde múltiples contratos hijos heredan de un único contrato padre, creando una estructura jerárquica en "forma de árbol" con un nodo raíz común. Este patrón permite compartir lógica común y propiedades entre varios contratos derivados, manteniendo al mismo tiempo diferencias específicas en cada uno de ellos.
Aquí te muestro un ejemplo de herencia jerárquica en Solidity:
Explicación del Código:
Vehicle
: Este es el contrato base o "padre" que define propiedades comunes (brand
ymodel
) y una función (getVehicleInfo
) aplicable a cualquier tipo de vehículo. Funciona como el nodo raíz común en la herencia jerárquica.Car
yTruck
: Estos son contratos "hijos" que heredan del contratoVehicle
. Cada uno de ellos extiende la funcionalidad base incluyendo propiedades específicas (carMaxSpeed
paraCar
ytruckLoadCapacity
paraTruck
) y funciones adicionales para interactuar con esas propiedades (getMaxSpeed
ygetLoadCapacity
, respectivamente). Aunque comparten algunas características comunes definidas enVehicle
,Car
yTruck
se especializan en diferentes aspectos de los vehículos que representan.
Características de la Herencia Jerárquica:
Especialización: Permite que los contratos hijos se especialicen añadiendo o modificando funcionalidades específicas.
Organización Clara: Facilita una estructura clara y lógica para los contratos, reflejando relaciones del mundo real y facilitando la comprensión y el mantenimiento del código.
Este patrón de herencia es especialmente útil en situaciones donde diferentes entidades comparten características comunes pero también necesitan sus propias implementaciones y características específicas.
Herencia múltiple
La herencia múltiple permite que un contrato herede comportamientos y características de múltiples contratos padres.
La herencia múltiple puede ser muy poderosa pero también puede introducir complejidad y ambigüedades. Es importante diseñar cuidadosamente la arquitectura de los contratos para evitar problemas comunes como la colisión de nombres o la dependencia circular entre contratos.
Ejemplo:
En este ejemplo, el contrato C
hereda de ambos, A
y B
, y tiene acceso a sus funciones foo
y bar
, respectivamente. El contrato C
introduce una nueva función fooBar
que combina las salidas de las funciones heredadas.
Last updated