Sollten Solidity-Schnittstellen immer Rückgabetypen angeben?

Ich habe Schnittstellen gesehen, in denen die Funktionsdefinitionen einen Rückgabetyp angeben, dh: (aus openZepplins IERC721.sol)

function balanceOf(address owner) public view returns (uint256 balance);

und manchmal, sogar in der gleichen Oberfläche, sehen Sie etwas wie:

function approve(address to, uint256 tokenId) public;

Offensichtlich macht es keinen Sinn, approveeine Einheit zurückzugeben. Es könnte jedoch einen booleschen Wert zurückgeben:

return(bool success)

Ich kann sehen, dass das Fehlen eines Rückgabetyps in der Schnittstelle mehr Flexibilität bei der Handhabung des Rückgabewerts durch die Implementierung ermöglicht, aber gibt es andere Nachteile/Vorteile, wenn ein Rückgabetyp angegeben wird, anstatt ihn aus der Schnittstelle herauszulassen?

Antworten (1)

Beobachten Sie, was passiert, wenn sie nicht übereinstimmen:

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

Fehler:

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;
    ^---------------------------------------------------^

Sie können eine andere Funktionssignatur definieren, die andere Argumente verwendet (die Funktionssignatur basiert auf einem Hash) und die als eine völlig andere Funktion behandelt wird. Der Compiler beschwert sich nicht.

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

Sie kann jedoch nicht bereitgestellt werden, da sie als vollständig separate Funktion behandelt wird, die die leere Funktion in der Schnittstelle nicht überschreibt. Folglich hat der Vertrag eine noch nicht definierte Transaktion von der Schnittstelle geerbt und kann daher nicht bereitgestellt werden.

Um zu sehen, was ich meine, versuchen Sie, es bereitzustellen.

Ich hoffe es hilft.

Nur zum Kontext, diese Frage wurde durch diesen Artikel aufgeworfen: medium.com/coinmonks/…