Solidity
Solidity 介面是否應該始終指定返回類型?
我見過函式定義指定返回類型的介面,即:(來自 openZepplin 的 IERC721.sol)
function balanceOf(address owner) public view returns (uint256 balance);
有時,即使在同一個界面中,您也會看到如下內容:
function approve(address to, uint256 tokenId) public;
approve
顯然,返回一個 uint是沒有意義的。但是,它可以返回一個布爾值:return(bool success)
我可以看到介面中沒有返回類型允許在實現如何處理返回值方面具有更大的靈活性,但是指定返回類型與將其排除在介面之外還有其他缺點/好處嗎?
觀察如果它們不匹配會發生什麼:
pragma solidity 0.4.25; contract ApproveInterface { function approve(address to, uint256 tokenId) public; } contract Approve is ApproveInterface { function approve(address to, uint256 tokenId) public returns(bool success) { return true; } }
錯誤:
browser/Interface1.sol:8:5: TypeError: Overriding function return types differ. function approve(address to, uint256 tokenId) public returns(bool success) { ^ (Relevant source part starts here and spans across multiple lines). browser/Interface1.sol:4:5: Overriden function is here: function approve(address to, uint256 tokenId) public; ^---------------------------------------------------^
您可以定義使用不同參數的不同函式簽名(函式簽名基於散列)並將被視為完全不同的函式。編譯器不會抱怨。
pragma solidity 0.4.25; contract ApproveInterface { function approve(address to, uint256 tokenId) public; } contract Approve is ApproveInterface { uint x; function approve(address to, uint256 tokenId, bytes32 other) public { x = 1; } }
但是,它是不可部署的,因為它被視為一個完全獨立的函式,不會覆蓋介面中的空函式。因此,合約從介面繼承了一個仍未定義的事務,因此無法部署。
要了解我的意思,請嘗試部署它。
希望能幫助到你。