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

特に注意すべき点が2つあります。

  1. オーバーライドされた関数は、としてマークする必要がありますvirtual。これは、現在のコントラクトの継承者が関数をオーバーライドできることを示します。
  2. 他の人の機能をオーバーライドする場合は、をマークする必要がありますoverride。これは、親契約の機能を書き直したことを示します。

疑問があるかもしれませんが、なぜ最初の契約balanceOfも追加する必要があるのoverrideですか?最初のコントラクトはインターフェースを継承するため、IERC721インターフェース内のすべての関数はデフォルトでvirtualタイプになります。

おすすめ

転載: blog.csdn.net/u012331525/article/details/122859969