Solidity中的继承

类似于Java中的多态,也是子继承父,孙继承父再继承爷。重写部分方法。

关键字:

virtual   //父类 
override  //子类

对于父类合约中的函数,在函数性质定义完之后可以加上“virtual“的关键字,这样代表这个函数到子类合约中需要被重写

contract JCA{  //充当父合约
    function foo() public pure virtual returns (string memory){
        return "A";
    }
    //添加了“virtual”代表该函数可以被重写
    function bar() public pure virtual returns (string memory){
        return "A";
    }
    function baz() public pure  returns (string memory){
        return "A";
    }
    //没有写“virtual”的方法将会被继承的子合约中
}

对于没有写关键字的函数则会将完整的函数继承到子类合约中。

对于子类,如果只继承一个父类合约的话,需要在开头声明继承的那个父合约,不像Java中使用”extand“的关键字,在solidity中使用”is“如

contract JCB is JCA{  //充当子合约
    function foo() public pure override  returns(string memory){
        return "B";
    }
    //增加“override”表示覆盖所继承合约中的函数部分,使用后别忘了在子合约名后添加上
    //“is 父合约名”
    function bar() public pure override returns (string memory){
        return "B";
    }
}

在子类合约中只继承一个合约时需要重写父类合约中带有”virtual“的函数,名相同,区别在于将”virtual“换成

”override“。

如果子类想继承多个合约的话需要采用

contract Z is X, Y{ //合约Z继承合约X与合约Y,如果还有则用逗号将合约名隔开

的方式,而且原则是:继承的少的放前面。并且在合约里对那些需要重写的函数

 function foo() public pure override(X,Y)  returns(string memory){
        return "de";
    }    
    //如果继承多个合约不仅在合约名哪里需要声明,在函数的方法里也需要
    //用“override(X,Y)”声明,第一个要注意继承的顺序,往后的声明则不需要注意顺序
    function bar() public pure override(Y,X)   returns (string memory){
        return "de";
    }

如果继承的合约中其中一个也是继承了别的合约,例如合约Y继承了合约X,合约Z继承了合约X和合约Y时,对合约Y里面那些要重写的函数

contract Y is X{ //合约Y继承合约X
    function foo() public pure virtual override  returns(string memory){
        return "shui";
    }    
    function bar() public pure virtual override  returns (string memory){
        return "shui";
    }
     function y() public pure returns (string memory){
        return "Y";
    }
}

 

热门相关:新婚夜,大佬调戏娇妻上瘾了   大爱晚成,卯上天价老婆   农家小福女   腹黑老公,请离婚!   欧神