访问控制public, internal 、 private等。

方法可以有4个可见性: external, public, internal 、 private。 默认是private。

状态变量有3个可见性:public, internal 、 private。默认是 internal。

消息调用:在其他合约中new一个合约,或者加载一个合约。调用被加载合约的方法。(也就是通过一个合约调用另一个合约)

external:只能修饰方法。
      external 的方法可以从其他合同和交易中调用。不能在内部调用(即f()不起作用,但this.f()可以)。外部函数在接收大的array有时更高效。

public:可以修饰状态变量和方法
     Public 方法可以从内部调用,也可以通过消息调用.  
     public 状态变量会自动生成一个getter方法 .

internal:
   internal的方法和状态变量只能合约内部调用 (只能当前合约调用,或者继承的合约调用), 不能使用this调用.

private:
    private的方法和状态变量,只能定义的合约可见,继承的合约也不可见

pragma solidity ^0.4.0;

contract C {
    uint private data;

    function f(uint a) private returns(uint b) { return a + 1; }
    function setData(uint a) public { data = a; }
    function getData() public returns(uint) { return data; }
    function compute(uint a, uint b) internal returns (uint) { return a+b; }
}

contract D {
    function readData() public {
        C c = new C();
        uint local = c.f(7); // 错误:private的方法只能定义它的合约能使用
        c.setData(3);
        local = c.getData();
        local = c.compute(3, 5); //错误:internal的方法只能定义它的合约或者 继承他的合约,能调用
    }
}

contract E is C {
    function g() public {
        C c = new C();
        uint val = compute(3, 5); // 继承的合约,能使用父合约的 internal成员
    }
}

本文是官方文档的翻译理解:

https://solidity.readthedocs.io/en/v0.4.24/contracts.html?highlight=visibility

猜你喜欢

转载自my.oschina.net/u/2601303/blog/1818215