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;
}
...
}
特に注意すべき点が2つあります。
- オーバーライドされた関数は、としてマークする必要があります
virtual
。これは、現在のコントラクトの継承者が関数をオーバーライドできることを示します。 - 他の人の機能をオーバーライドする場合は、をマークする必要があります
override
。これは、親契約の機能を書き直したことを示します。
疑問があるかもしれませんが、なぜ最初の契約balanceOf
も追加する必要があるのoverride
ですか?最初のコントラクトはインターフェースを継承するため、IERC721
インターフェース内のすべての関数はデフォルトでvirtual
タイプになります。