区块链:Solidity合约中属性和行为的访问权限

属性的访问权限

属性: 状态变量

pragma solidity ^0.4.4;

/*
public >internal(这是合约属性默认的访问权限) >private
 */
contract Person {
  uint internal _age;
  uint _weight;
  uint private _height;
  uint public _money;

  function _money() constant returns (uint) {
    return 120;
  }
}

区块链:Solidity合约中属性和行为的访问权限_第1张图片

我们可以看见只有_money可以被访问到。public会自动生成getter方法。当我们重写getter方法时,重写方法的优先级会更高,会被优先调用。当然,生成的这个get函数会覆盖public类型的属性自动生成的get函数。

方法/行为访问权限

方法/行为:合约里面的函数

pragma solidity ^0.4.4;

contract Person {

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

  function weight() constant returns (uint) {
    return 180;
  }

  function height() constant returns (uint) {
    return 172;
  }

  function money() constant returns (uint) {
    return 32000;
  }
}

区块链:Solidity合约中属性和行为的访问权限_第2张图片

合约中的方法默认为public类型

pragma solidity ^0.4.4;

contract Person {

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

  function weight() constant public returns (uint) {
    return 180;
  }

  function height() constant internal returns (uint) {
    return 172;
  }

  function money() constant private returns (uint) {
    return 32000;
  }
}

区块链:Solidity合约中属性和行为的访问权限_第3张图片

属性和方法在自己合约内部的访问权限总结

pragma solidity ^0.4.4;

/*
public >internal(这是合约属性默认的访问权限) >private
 */
contract Animal {
  uint _weight;
  uint private _height;
  uint internal _age;
  uint public _money;

 //public
  function test() constant public returns (uint) {
    return _weight;
  }

  function test1() constant public returns (uint) {
    return _height;
  }

  function test2() constant internal returns (uint) {
    return _age;
  }

  function test3() constant private returns (uint) {
    return _money;
  }

  function testInternal() constant public returns (uint) {
    return this.test();
  }

  function testInternal1() constant public returns (uint) {
    return this.test1();
  }

/* 报错 如果使用函数指针进行访问,仅仅可以使用public修饰的 */
  /* function testInternal2() constant public returns (uint) {
    return this.test2();
  } */

  function testInternal2() constant public returns (uint) {
    return test2();
  }
}

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

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

备注

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

你可能感兴趣的:(区块链)