Herencia
Last updated
Was this helpful?
Last updated
Was this helpful?
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
, y external
) 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:
Grandparent
: Este es el contrato de nivel base que define una variable grandparentValue
y una función setGrandparentValue
para modificarla. También tiene un constructor que inicializa grandparentValue
.
Parent
: Este contrato hereda de Grandparent
. Añade su propia variable parentValue
y una función setParentValue
para modificarla. Su constructor llama al constructor de Grandparent
para inicializar grandparentValue
, y también inicializa parentValue
.
Child
: Este es el contrato de nivel más bajo que hereda de Parent
(y, por lo tanto, indirectamente de Grandparent
). Añade una variable childValue
y una función setChildValue
. Su constructor inicializa las variables de todos los niveles de la jerarquía llamando al constructor de Parent
, que a su vez llama al constructor de Grandparent
.
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
y model
) 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
y Truck
: Estos son contratos "hijos" que heredan del contrato Vehicle
. Cada uno de ellos extiende la funcionalidad base incluyendo propiedades específicas (carMaxSpeed
para Car
y truckLoadCapacity
para Truck
) y funciones adicionales para interactuar con esas propiedades (getMaxSpeed
y getLoadCapacity
, respectivamente). Aunque comparten algunas características comunes definidas en Vehicle
, Car
y Truck
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.