如需获取本内容的最新版本,请参见 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 尝试一下
END