Solidity属性和函数的权限

Solidity属性和函数的权限

1.Solidity实现一个类(智能合约):

pragma solidity ^0.4.4;
/*
pragma:版本声明
solidity:开发语言
0.4.4:当前合约大版本,0.4代表主版本,.4代表修复bug的升级版
^:代表向上兼容,0.4.4~0.4.9可以对我们当前的代码进行编译
*/

//contract Person 类比 class Person extends Contract
contract Person {
    uint _height;  //身高
    uint _age;//年龄
    address _owner;//合约的拥有者
    //方法名和合约名相同时为构造函数,创建对象时,构造函数会自动调用实例化对象
    
    function Person() {
      _height=180;
      _age=22;
      _owner=msg.sender;
    }

    function owner() constant returns (address) {
      return _owner;
    }
    //set方法,设置height方法
    function setHeigh(uint height) {
      _height=height;
    }

    //get方法 读取 ,constant 代表方法只读
    function heigh() constant returns (uint) {
      return _height;
    }

    function setAge(uint age) {
      _age=age;
    }

    
    function age() constant returns (uint){
      return _age;
    }

    function kill()  {
      if(_owner==msg.sender){
        //析构函数
        selfdestruct(_owner);
      }
      
    }
    
}

2.Solidity合约中属性和行为的访问权限:

  • 属性的访问权限:状态变量
pragma solidity ^0.4.4;

//返回值为0
//public internal private
contract Person {
  //internal 是合约属性默认的访问权限
  uint internal _age;

  uint _weightl;//默认

  uint private _hegiht;

  uint public _money;

  function _money() constant returns (uint){
      return _money;
  }
  
}
  • 说明:属性默认类型为internal,internal,和private类型的属性都不能被外部访问,当类型为public类型时,就会生成一个和属性类型名相同并且返回就是当前属性的get函数。比如:
uint pulic _money;

会生成一个

function _money() constant returns (uint){
}
pragma solidity ^0.4.4;

//在这个代码中 _money返回值为120,而不是0
// public internal private
contract Person {
  //internal 是合约属性默认的访问权限
  uint internal _age;

  uint _weightl;//默认

  uint private _hegiht;

  uint public _money;

  function _money() constant returns (uint){
      return 120;
  }
  
}
  • 方法/行为访问权限:合约里的函数

    • 合约中的方法默认为public类型
pragma solidity ^0.4.4;


//public internal private
contract Person {
  function height() constant returns(uint){
      return 120;
  }
  
  function age() constant returns (uint){
      return 22;
  }
  
}

  • Solidity属性和函数的权限

pragma solidity ^0.4.4;


//public internal private
contract Person {
  function height() constant public returns(uint){
      return 120;
  }
  
  function age() constant internal returns (uint){
      return 22;
  }
  function money() constant private returns(uint){
      return 3200;
  }
}

Solidity属性和函数的权限

pragma solidity ^0.4.4;


//public internal private
contract Person {
  uint _weight;
  uint private _hegiht;
  uint internal _age;
  uint public _money;

  function test() constant returns(uint) {
    return _weight;
  }
  
  function test1() constant returns(uint) {
    return _hegiht;
  }
  function test2() constant returns(uint) {
    return _age;
  }
  function test3() constant returns(uint) {
    return _money;
  }
}

Solidity属性和函数的权限

pragma solidity ^0.4.4;


//public internal private
contract Person {
  uint _weight;
  uint private _hegiht;
  uint internal _age;
  uint public _money;

  function test() constant returns(uint) {
    return _weight;
  }
  
  function test1() constant public returns(uint) {
    return _hegiht;
  }
  function test2() constant internal returns(uint) {
    return _age;
  }
  function test3() constant private returns(uint) {
    return _money;
  }
}

Solidity属性和函数的权限
属性默认权限为internal,只有public类型的属性才可能供外部访问,internal和private类型的属性智能在合约内部使        用。

函数的权限默认是public类型,public类型的函数可提供外部访问,而internal和private类型的函数不能够通过指针        进行访问,哪怕是在内部通过this访问都会报错,在合约内部访问,我们可以直接访问函数就可以了

备注:不管是属性还是方法,只有是public类型时,才可以通过合约地址进行访问,合约内部的this就是当前合约的地址。在合约内部如果要访问internal和private类型的属性或者是函数,直接访问即可,不要试图通过this去访问。

pragma solidity ^0.4.4;


//public internal private
contract Person {
  uint _weight;
  uint private _hegiht;
  uint internal _age;
  uint public _money;

  function test() constant returns(uint) {
    return _weight;
  }
  
  function test1() constant public returns(uint) {
    return _hegiht;
  }
  function test2() constant internal returns(uint) {
    return _age;
  }
  function test3() constant private returns(uint) {
    return _money;
  }
  
  function testInternal() constant returns(uint){
      return this.test();
  }
   function testInternal2() constant returns(uint){
      return this.test1();
  }
   function testInternal3() constant returns(uint){
      return test2();//internalhe和private 直接访问就行
  }
   function testInternal4() constant returns(uint){
      return test3();
  }
}