Herencia C++ (o generalmente OOP) en Solidity

En Solidez, cuando se hace herencia, los dos contratos comparten estado. Algo de pseudocódigo,

contract A {
uint myVar = 1
setVar() {myVar = 3}
}

contract B is A {
myVar = 2
} 

Si implemento A, A.myVar = 1. Si implemento B y luego llamo a A.setVar(), B.myVar = 3 (y no 2).

Claramente, los contratos heredados comparten estado en Solidity.

En C++, las clases heredadas no comparten estado. Si desea este tipo de funcionalidad de estado compartido, deberá usar la palabra clave "virtual" para hacer referencia a los datos en la memoria (independientemente de las clases).

¿Cómo puedo obtener la funcionalidad de "herencia de C++" en Solidity? Por ejemplo, si implemento A, luego implemento B, B hereda la funcionalidad de A (es decir, setVar()) pero no comparten el estado , por lo que A.myVar = 1 y B.myVar = 2 después de la implementación de ambos contratos. Si llamara a A.setVar(), B.myVar seguiría siendo 2.

"Si implemento A, A.myVar = 1. Si implemento B y luego llamo a A.setVar(), B.myVar = 3 (y no 2)". No creo que eso sea cierto. ¿Puedes compartir exactamente lo que hiciste para lograr ese resultado?

Respuestas (2)

La respuesta a esta pregunta podría ayudar un poco aquí: Solidez, ¿es posible implementar un contrato inteligente que evite que otros contratos inteligentes hereden de él?

Básicamente, la herencia es una característica del lenguaje Solidity, no del EVM o del código de bytes que procesa, por lo que no puede llamar a funciones en el contrato B a través de una referencia al contrato A.

En última instancia, dos contratos implementados no pueden compartir el mismo estado. No estoy seguro de qué podría estar haciendo mal arriba, pero la única forma en que podría obtenerlo b.myVar() = 3es haciendo b.setVar(3)dónde bestá una instancia del contrato implementado B.

¿Qué estás usando para codificar y experimentar con estos contratos? ¿Estás usando Truffle o Remix o algo más?

No es posible.

En Solidity, cuando 'heredas' de otro contrato, en realidad estás fusionando los dos contratos. Entonces, en esencia, es el mismo contrato después de compilar. Los contratos principal y secundario son los mismos después de la compilación y la implementación. No hay instancias separadas de contratos/clases, como encontramos en otros lenguajes OOP.