Solidity基础教程:合约的继承与方法的重写
Solidity基础教程:合约的继承与方法的重写
合约继承
合约继承使用is关键字
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]; } ... }
方法重写
方法重写的前提就是当前合约继承其他合约,并且其他合约中的某个需要被重写的方法标注为virtual。例如下面这个@openzippelin/contracts库的,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]; } ... }
在新合约中,我们可以直接继承上述合约并且重写balanceOf,注意新的函数需要增加override标识。
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; } ... }
有两点需要特别注意:
- 被重写的函数必须标注为virtual,表示当前合约的继承者可以重写该函数。
- 重写别人的函数必须标注为override,表示我重写了父合约的函数。
可能存在疑问,为什么第一个合约中的balanceOf也需要添加override呢?因为第一个合约继承了IERC721接口,接口中的所有函数都默认为virtual类型。