Solidity語言學習筆記————30、函式過載

FLy_鵬程萬里發表於2018-07-03

函式過載(Function Overloading)

合約可以有多個同名但不同輸入引數的函式。這也適用於繼承的函式。下面示例展示了合約A中對函式f的過載。

pragma solidity ^0.4.16;

contract A {
    function f(uint _in) public pure returns (uint out) {
        out = 1;
    }

    function f(uint _in, bytes32 _key) public pure returns (uint out) {
        out = 2;
    }
}

在外部介面中也存在過載的函式。如果兩個外部可見的函式的Solidity型別不同,但外部型別相同,不能成功過載。

// 下面程式碼無法編譯
pragma solidity ^0.4.16;

contract A {
    function f(B _in) public pure returns (B out) {
        out = _in;
    }

    function f(address _in) public pure returns (address out) {
        out = _in;
    }
}

contract B {
}

以上兩個f函式都接受了ABI的地址型別,雖然它們的Solidity型別不同。(合約型別相當於地址型別)

過載解析和引數匹配(Overload resolution and Argument matching)

通過將當前範圍內的函式宣告與函式呼叫中提供的引數相匹配,可以選擇過載函式。如果所有引數都可以隱式地轉換為預期型別,該函式則被選擇作為過載候選項。如果沒有一個候選,解析失敗。

註解
返回引數沒有考慮到過載解析。
pragma solidity ^0.4.16;

contract A {
    function f(uint8 _in) public pure returns (uint8 out) {
        out = _in;
    }

    function f(uint256 _in) public pure returns (uint256 out) {
        out = _in;
    }
}
Calling f(50) would create a type error since 250 can be implicitly converted both to uint8 and uint256 types. On another hand f(256) would resolve to f(uint256) overload as 256 cannot be implicitly converted to uint8. 
呼叫f(50)會有一個型別錯誤,因為250可以隱式地轉換為uint8uint256型別。另一方面,f(256)將解析為f(uint256)過載,因為256不能隱式地轉換為uint8

相關文章