Tutorial básico de Solidity: herencia de contratos y reescritura de métodos
contrato de herencia
herencia de contrato usando is
palabras clave
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
...
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
...
}
anulación del método
La premisa de la anulación de métodos es que el contrato actual hereda otros contratos, y un método en el otro contrato que debe anularse se marca como virtual
. Por ejemplo , el método en la implementación del contrato de la siguiente @openzippelin/contracts
biblioteca .ERC721
balanceOf
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
...
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
...
}
En el nuevo contrato, podemos heredar directamente el contrato anterior y reescribirlo balanceOf
. Tenga en cuenta que la nueva función debe override
marcarse.
contract TarotCard is ERC721 {
...
function balanceOf(address owner) public view override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return 0;
}
...
}
Hay dos puntos a los que hay que prestar especial atención:
- La función anulada debe marcarse como
virtual
, lo que indica que el heredero del contrato actual puede anular la función. - Anular las funciones de otras personas debe marcarse como
override
, lo que indica que he reescrito la función del contrato principal.
Puede haber dudas, ¿por qué balanceOf
hay que añadir también el primer contrato override
? Debido a que el primer contrato hereda la IERC721
interfaz, todas las funciones en la interfaz tienen virtual
tipos predeterminados.