快捷搜索: 王者荣耀 脱发

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;
    }
    ...
}

有两点需要特别注意:

  1. 被重写的函数必须标注为virtual,表示当前合约的继承者可以重写该函数。
  2. 重写别人的函数必须标注为override,表示我重写了父合约的函数。

可能存在疑问,为什么第一个合约中的balanceOf也需要添加override呢?因为第一个合约继承了IERC721接口,接口中的所有函数都默认为virtual类型。

经验分享 程序员 微信小程序 职场和发展