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 类型。
|