Solidity中的多重继承

  • bojack
  • 更新于 2022-08-01 10:27
  • 阅读 3013

在Solidity中实现多重继承,重写virtual函数。

写合约的过程中,经常遇到继承多个合约,需要override的情况。比如openzeppelin

ERC1155,AccessControl都实现了supportsInterface函数,如果你的合约同时继承这两个合约,需要重写此函数。

定义2个基类BaseContact1BaseContact2, 使用virtual关键字。

contract BaseContact1 {

    function getColor() virtual public view returns(string memory color) {
        return "red";
    }

    function makeColor() virtual public pure {

    }
}

实现ImplContract继承自上面两个基类,此时如果不override virtual函数,编译会提示以下错误。

Derived contract must override function "supportsInterface". Two or more base classes define function with same name and parameter types.

使用override关键字,重写两个virtual函数, 重写后的函数也可以继续用virtual修饰,给子类提供重写的可能。

override(BaseContact1, BaseContact2)

完整代码如下

pragma solidity ^0.8.0;

contract BaseContact1 {

    function getColor() virtual public view returns(string memory color) {
        return "red";
    }

    function makeColor() virtual public pure {

    }
}

contract BaseContact2 {

    function getColor() virtual public view returns(string memory color) {
        return "yellow";
    }

    function makeColor() virtual public pure {

    }
}

contract ImplContract is BaseContact1, BaseContact2 {

    // override only
    function getColor() public override(BaseContact1, BaseContact2) view returns(string memory color){
        // mix colors
        return string(abi.encodePacked(BaseContact2.getColor(), "&" ,BaseContact1.getColor()));
    }

    // override + virtual,child 可以继续override
    function makeColor() public virtual override(BaseContact1, BaseContact2) pure {

    }
}
点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
bojack
bojack
0xE913...318c
https://github.com/huaigu