pragma solidity ^0.4.0; // priveta public internal contract Test{ //defualt internal uint8 internal _money; uint8 _age; uint8 private _height; uint8 public _sex; function test() constant returns(uint8){ return _money; } function testAge() constant returns(uint8){ return _age; } function testHeight()constant returns(uint8){ return _height; } function testSex() constant returns(uint8){ return _sex; } function testSex1() external returns(uint8){ return 10; } function testAddress1() constant returns(address){ return msg.sender; //0xca35b7d915458ef540ade6068dfe2f44e8fa733c } } contract Test1{ uint _mouth; function Test1(){ _mouth = 11; } function mouth() returns(uint){ return _mouth; } } contract SubTest is Test,Test1{ function testAddress2()constant returns(address){ return msg.sender;//0xca35b7d915458ef540ade6068dfe2f44e8fa733c } function testInternel1()constant returns(uint8){ return _money; } function testInternel2()constant returns(uint8){ return _age; } /*DeclarationError: Undeclared identifier function testPrivate() returns(uint8){ //cannot call Private function/attribute return _height; } */ function testPublic()constant returns(uint8){ return _sex; } function testExternal()constant returns(uint8){ return this.testSex1(); //return this.testSex1; TypeError: Return argument type function () external returns (uint8) //is not implicitly convertible to expected type (type of first return variable) uint8 //return testSex1; DeclarationError: Undeclared identifier } function mouth() returns(uint){ return 100; //Rewriting the Mouth function in the subcontract overrides the value written by the parent function,only Public function can be overrided } }
public
1.public类型的状态变量和函数的权限最大,可供外部、子合约、合约内部访问。
2.状态变量声明时,默认为internal类型,只有显示声明为public类型的状态变量才会自动生成一个和状态变量同名的get函数以供外部获取当前状态变量的值。
函数声明时默认为public类型,和显示声明为public类型的函数一样,都可供外部访问。
internal
1.internal类型的状态变量可供外部和子合约调用。
2.子合约中能继承父合约中的所有的public/external类型的函数,不能继承private的函数,也无法调用;internal无法继承,可以调用
private 1.private私有类型,只能在本合约内部使用,所以在子合约中尝试使用时,就会报错。
external
1.子合约调用父合约中的external函数时,可以用this.testSex1()/testSex1()
重写
子合约可以将父合约的public类型的函数,只能继承public类型的函数,继承过来的函数进行重写(父函数不是只读属性(constant))
//https://pan.baidu.com/s/1cRICAY9aSHn6vNI4YN1tQQ