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是不可以通过这种方式来访问的,直接属性,或者方法()就可以访问

 

posted @ 2019-04-07 04:27  风不再来  阅读(1008)  评论(0编辑  收藏  举报