您的位置:首页 > 其它

访问控制public, internal 、 private等。

2018-05-24 17:59 323 查看
方法可以有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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  访问控制 solidity