16-Solidity8.0多重继承

Solidity8.0

16-Solidity8.0多重继承


在这里插入图片描述


前言

多重继承
Solidity 支持多重继承。合约可以使用is关键字继承其他合约。

将被子合同覆盖的函数必须声明为virtual.

将要覆盖父函数的函数必须使用关键字override。

继承顺序很重要。

您必须按照从“最基础”到“最衍生”的顺序​​列出父合约。


一、Solidity多重继承

1.多重继承

代码如下(示例):

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

/* Graph of inheritance
    A
   / \
  B   C
 / \ /
F  D,E

*/

contract A {
    
    
    function foo() public pure virtual returns (string memory) {
    
    
        return "A";
    }
}

// Contracts inherit other contracts by using the keyword 'is'.
contract B is A {
    
    
    // Override A.foo()
    function foo() public pure virtual override returns (string memory) {
    
    
        return "B";
    }
}

contract C is A {
    
    
    // Override A.foo()
    function foo() public pure virtual override returns (string memory) {
    
    
        return "C";
    }
}

// 合同可以从多个父合同中继承。
// 当一个函数被调用时,它在不同的合同中被多次定义。
// 不同合约中多次定义的函数时,父合约将从右到左,以深度优先的方式搜索。
contract D is B, C {
    
    
    // D.foo() returns "C"
    // since C is the right most parent contract with function foo()
    function foo() public pure override(B, C) returns (string memory) {
    
    
        return super.foo();
    }
}

contract E is C, B {
    
    
    // E.foo() returns "B"
    // since B is the right most parent contract with function foo()
    function foo() public pure override(C, B) returns (string memory) {
    
    
        return super.foo();
    }
}

// 继承的顺序必须是从 "最基本 "到 "最派生"。
// 调换A和B的顺序会产生一个编译错误。
contract F is A, B {
    
    
    function foo() public pure override(A, B) returns (string memory) {
    
    
        return super.foo();
    }
}


总结

日拱一卒。

猜你喜欢

转载自blog.csdn.net/yyjava/article/details/125295095