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;
}
}
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;
}
}
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;
}
}
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;
}
}
属性默认权限为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();
}
}