智能合约 合约继承

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

将被子协定覆盖的函数必须声明为 。virtual

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

继承顺序很重要。

您必须按照从 “most base-like” 到 “most derived” 的顺序列出父合约。

调用父级的合约用 super

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

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

*/

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

// 继承合约用is
contract B is A {
    // Override 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();
    }
}
posted @ 2025-04-24 17:51  张志健  阅读(52)  评论(0)    收藏  举报