方法可以有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