Solidity属性和方法的访问权限
属性:默认是internal的类型,外部是不可以访问调用的,如果加上public的话,那么是会自动为这个属性加上一个get的方法的,比如uint public _age; => function _age() {} 自动生成
方法:默认是public的类型,外部是可以直接访问调用的
public:,不管是属性还是方法都可以通过合约地址的形式来进行访问,this.xxxxx()的形式,public属性:_age(),public方法:tets2()
internal,private:,就不用加this,直接访问,如果是属性的话,就直接属性age就可以了,如果是方法的话,那么就test2()就可以了,不用加this,指针的形式来访问(合约地址的形式)
pragma solidity ^0.4.4;
//internal默认是合约内部的访问权限
//internl和private外部都是不能访问的
uint _age;//现在外部是访问这个_age的,默认的是internal,内部访问
uint public _weight;//这个会自动生成一个get函数,public,可以被调用,在页面可以看到_weight方法(实际上是一个get方法)
// public,当属性的类型是public的时候,会生成一个和属性名相同的并且返回值就是当前属性的get函数
//下面的方法把上面public自动生成的get函数给覆盖掉了
function _weight() constant returns(uint){
return 111;//返回的是状态变量,调用_weight返回的是111
}
}
//如果想用合约的指针去访问的话,只能是public的类型
pragma solidity ^0.4.13;
contract Person {
uint _age;//默认是internal的类型
uint public _weight;//会自动生成一个_weight的get函数
uint private _money;
function test() constant public returns (uint) {
return _age;
}
function test2() constant internal returns(uint){
return _age;
}
function get() contract returns(uint) {
this._weight();//_weight会自动生成一个_weight的get函数,所以是可以通过this来进行访问的,但是_money是private的类型,所以是不能通过这个this指针的形式来进行访问的,否则会报错
return this.test();//因为test方法是public的类型,所以是可以访问调用的
//this就是当前的合约地址,如果是internal的类型的话,不能通过this来进行访问
//如果要访问internal的方法类型的时候,直接把this去掉,就是test()()
}
function get2() constant returns(uint){
return test2();//tets2是internal的方法类型,所以是不用加上this直接进行访问的
//注明:如果是intrnal,private的类型的时候,是不可以通过指针进行访问的,在合约内部访问都会报错,加指针的话
}
}
属性默认是internal的类型,是不会自动生成属性的get函数的,如果是public的话,那么会自动生成这个属性的get函数,可以被调用
方法默认是public的类型
如果内部访问public的类型,不管是方法还是属性的话,可以通过this.xx(),的形式(合约地址的形式)来访问,如果是internal,private是不可以通过这种方式来访问的,直接属性,或者方法()就可以访问