智能合约 合约继承
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();
}
}

浙公网安备 33010602011771号