Solidity学习::(6)智能合约继承

例子1:

contract owned {
    funtion owned() { owner =msg.sender;} //构造函数
    address owner;
}
contract mortal is owned { //mortal继承自owned
    function kill() {
        if(msg.sender==owner) selfdestruct(owned);
    }
}
contract Base1 is mortal {
    function kill() { /* do clean up 1*/   super.kill();}
}
contract Base2 is mortal {
    function kill() { /* do clean up 2*/   super.kill();}
}
contract Final is Base2,Base1{
}
  • Base1和Base2是mortal的派生合约
  • Final是Base2和Base1的派生合约
  • Final派生自两个合约(Base2和Base1),这两个父合约的顺序是有意义的,继承时会按照从左到右的顺序依次继承重写。
  • 合约中的函数都是虚函数,这意味着除非指定类名,否则调用的都是最后派生的函数。
  • 在例子中,Final先继承Base2,然后继承Base1,此时Base2中的kill函数将被Base1中的kill函数重写。
  • 所以,Final的继承序列为Final、Base1、Base2、mortal、owned
  • 当调用Final实例的kill函数时,将依次调用:Base1.kill()、Base2.kill()、mortal.kill()
  • 若Base1和Base2中的super.kill()换成mortal.kill(),则调用顺序为Base1.kill()、mortal.kill()

 例子2:(继承合约参数)

contract Base{
    uint x;
    function Base(uint _x) {x=_x;}
}
contract Derived is Base(7) {
    function Derived(uint _y) Base(_y *_y) {
    }
}
  • 派生合约的构造函数需要提供基类合约构造函数的所有参数,有两种方法
  • 第一种是上面  在继承列表中指定  is Base(7)
  • 另一种是在定义派生类的构造函数时,提供  Base (_y *_y),当基本合约(基类)的构造函数参数为变量时,应当用这种方式。
  • 当两种方式同时存在时,以第二种方式为准。

例子3:(抽象合约)

contract Feline{
    function utterance() returns (bytes32);    //抽象合约
}
contract Cat is Feline{
    function utterance() returns (bytes32) {return "miaow";}
}
  •  Solidity允许使用抽象合约。
  • 抽象合约是指一个合约只有函数声明而没有函数的具体实现,即函数的声明以“;”结束
  • 只要合约中有一个函数没有具体的实现,即使合约中其他函数已实现,这一抽象合约就不能被编译。

猜你喜欢

转载自blog.csdn.net/dieju8330/article/details/82763363