3分钟Solidity: 4.10 Inheritance继承

30 阅读1分钟

如需获取本内容的最新版本,请参见 Cyfrin.io 上的Inheritance(代码示例)

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

子合约将要覆盖的函数必须声明为 virtual

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

继承顺序很重要,必须按照从“最基础”到“最派生”的顺序列出父合约。

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

/* 继承关系图
    A
   / \
  B   C
 / \ /
F  D,E

*/

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

// 合约通过使用关键字“is”来继承其他合约。
contract B is A {
    // 重写 A.foo()
    function foo() public pure virtual override returns (string memory) {
        return "B";
    }
}

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

// 合约可以从多个父合约继承。
// 当调用一个在不同合约中多次定义的函数时,会从右到左、以深度优先的方式搜索父合约。

contract D is B, C {
    // D.foo() 返回 "C"
    // 因为C是最右边的父合约,带有函数foo()
    function foo() public pure override(B, C) returns (string memory) {
        return super.foo();
    }
}

contract E is C, B {
    // E.foo() 返回 "B"
    // 因为B是最右侧的父合约,具有函数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();
    }
}

Remix Lite 尝试一下

solidity-继承


END