3分钟Solidity: 4.12 调用父合约

18 阅读1分钟

如需获取本内容的最新版本,请参见 Cyfrin.io 上的“调用父合约(代码示例)”

父合约可以直接调用,也可以通过关键字 super 来调用。

使用关键字 super 时,所有直接父合约都将被调用。

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

/* 继承树
   A
 /  \
B   C
 \ /
  D
*/

contract A {
    // 这被称为事件。你可以从你的函数中发出事件,它们会被记录到事务日志中。
    // 在我们的案例中,这将有助于追踪函数调用。
    event Log(string message);

    function foo() public virtual {
        emit Log("A.foo called");
    }

    function bar() public virtual {
        emit Log("A.bar called");
    }
}

contract B is A {
    function foo() public virtual override {
        emit Log("B.foo called");
        A.foo();
    }

    function bar() public virtual override {
        emit Log("B.bar called");
        super.bar();
    }
}

contract C is A {
    function foo() public virtual override {
        emit Log("C.foo called");
        A.foo();
    }

    function bar() public virtual override {
        emit Log("C.bar called");
        super.bar();
    }
}

contract D is B, C {
    // 尝试:
    // - 调用 D.foo 并检查交易日志。
    // 虽然 D 继承了 A、B 和 C,但它只调用了 C 和 A。
    // - 调用 D.bar 并检查交易日志
    // D 调用了 C,然后是 B,最后是 A。
    // 虽然 super 被调用了两次(由 B 和 C),但它只调用了 A 一次。

    function foo() public override(B, C) {
        super.foo();
    }

    function bar() public override(B, C) {
        super.bar();
    }
}

Remix Lite 尝试一下

solidity-calling_parent_contracts

END