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