Solidity
為什麼ERC721 OZ合約中有兩個同名函式?
我在看OpenZeppelin ERC721 contract,函式
_safeMint
定義了兩次:/** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); }
兩者的評論都沒有幫助我理解。我可以看到他們收到不同數量的參數,但是合約怎麼知道我在呼叫哪一個呢?
我的問題是這是如何工作的?它不應該導致編譯錯誤或至少一個覆蓋另一個嗎?為什麼要使用相同的名稱,這是我不知道的功能嗎?
您可以擁有多個具有相同名稱的函式,只要它們的簽名不同即可。參數也是簽名的一部分,所以這兩個函式的函式簽名是不同的。因此,這些功能不會以任何方式混淆。每當您呼叫合約函式時,您也必須提供參數。根據名稱和提供的參數選擇執行的函式。
第一個函式只是秒針的簡寫版本,因為它呼叫了第二個函式。它們可以有不同的名稱,並且以相同的方式工作,但可能選擇了相同的名稱,因為第一個只是指向第二個。