区块链 solidity 函数类型

solidity 函数访问权限

solidity为函数提供了四种访问权限:public,internal,private,external

public:公共函数,内部正常访问,外部正常访问,子类可以继承 internal:内部函数,内部正常访问,外部无法访问,子类可以继承。 private: 私有函数,内部正常访问,外部无法访问,子类无法继承。 external: 外部函数,内部不能访问,外部正常访问,子类可继承。

pragma solidity ^0.4.19;

contract Animal {  
    // public  公有:外部、内部、子类都可使用
    function testPublic() public pure returns (string) {
        return "public";
    }
    // private 私有:合约内部可以正常访问
    function testPrivate() private pure returns (string) {
        return "private";
    }
    // internal 内部:合约内部可以正常访问
    function testInternal() internal pure returns (string) {
        return "internal";
    }
    // external 外部:只能供外部访问
    function testExternal() external pure returns (string) {
        return "external";
    }
// 未做任何修改时,使用pure
    function f1() public pure {
        testPublic();
        testInternal();
        testPrivate();
        //testExternal(); // 报错,只能供外部访问
    }

}

contract Dog is Animal {  
    // 继承 public、internal、external 类型的函数
     function f() public pure returns (string) {
    // testPublic();
    // testInternal();
    // testPrivate();
    // testExternal(); //报错,因为只能供外部访问
    return testInternal();
  }
}

将案例代码放入https://remix.ethereum.org/运行一下,得到如下结果

solidity类的多继承

可用同时继承多个父类

pragma solidity ^0.4.19;

contract Animal1 {

  uint age; //默认的就是internal
  string private sex;//male femal

}

contract Animal2 {
  uint public weight;//public
}

 //Dog可以同时继承自多个父类,多继承
contract Dog is Animal1 , Animal2 {
  function test() private {
    age = 100; //成功继承
    sex = "male"; //报错
    weight = 130; //成功继承
  }
}

solidity子类重写父类方法

子类重写了父类继承过来的方法,会以子类的方法为基准

pragma solidity ^ 0.4.19;

// 重写:
// 子类重写了父类继承过来的方法,会以子类的方法为基准
contract Animal {
  function testFunc() public pure returns(string) {
    return "Animal testFunc";
  }
}

contract Dog is Animal {
  function testFunc() public pure returns(string) {
    return "Dog testFunc";
  }
}

solidity函数中pure、view、constant的用法

solidity函数的格式为: function 函数名(参数) public|private|internal|external pure|view|constant 无返回值|returns (返回值类型)

下面案例我们根据案例来总结:

pragma solidity ^0.4.18;

contract HelloWorld {

  uint age = 45;
  uint weight = 56;
  uint height = 180;
  function test() public pure returns (string) {
    return "HelloWorld!";
  }


  function getAge() public returns (uint) {
    return age;
  }

  function getWeight() public view returns (uint) {
    return weight;
  }

  function getHeight() public constant returns (uint) {
    return height;
  }

}

当函数有返回值,函数中正常来讲需要有 pure|view|constant关键字 如果没有返回值,在调用函数过程中,需要主动去调用底层的call()方法 当函数返回值为全局变量或属性时,可以使用view或者constant view可以理解成constant的新版本,可以简单理解成他们俩等价 pure :如果知识纯粹的返回一个值,直接使用pure 反之,使用view或者constant即可

基本值类型、引用类型

uint为值类型,为深拷贝 string为引用类型,既可以深拷贝,也可以浅拷贝

uint及string深拷贝(默认的声明方式即为深拷贝):

string a = "100";  
uint b = 100;

// 浅拷贝
// string aa 等同于 string memory aa
function m(string aa) private {  
    aa = "1000";
}
function n(uint bb) private {  
    bb = 1000;
}

function f() public {  
    m(a)
    n(b)
}

string类型浅拷贝(加storage关键字):

string a = "100";  
function f() public {  
    m(a)
}

// 深拷贝
// memory(深拷贝)、 storage(浅拷贝)
// 当函数参数为 storage 类型时,函数类型只能为 private 或 internal,否则报错
function m(string storage aa) private {  
    //aa = "1000"; // string不能直接修改,需要转换为可变的字节数组
    bytes(aa)[0] = '6';
}

function getA() public view returns (string) {  
    return a;
}

注:当函数参数为 storage 类型时,函数类型只能为 private 或 internal

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享