Solidity8.0
16-Solidity8.0多重继承
前言
多重继承
Solidity 支持多重继承。合约可以使用is关键字继承其他合约。
将被子合同覆盖的函数必须声明为virtual.
将要覆盖父函数的函数必须使用关键字override。
继承顺序很重要。
您必须按照从“最基础”到“最衍生”的顺序列出父合约。
一、Solidity多重继承
1.多重继承
代码如下(示例):
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
/* Graph of inheritance
A
/ \
B C
/ \ /
F D,E
*/
contract A {
function foo() public pure virtual returns (string memory) {
return "A";
}
}
// Contracts inherit other contracts by using the keyword 'is'.
contract B is A {
// Override A.foo()
function foo() public pure virtual override returns (string memory) {
return "B";
}
}
contract C is A {
// Override A.foo()
function foo() public pure virtual override returns (string memory) {
return "C";
}
}
// 合同可以从多个父合同中继承。
// 当一个函数被调用时,它在不同的合同中被多次定义。
// 不同合约中多次定义的函数时,父合约将从右到左,以深度优先的方式搜索。
contract D is B, C {
// D.foo() returns "C"
// since C is the right most parent contract with function foo()
function foo() public pure override(B, C) returns (string memory) {
return super.foo();
}
}
contract E is C, B {
// E.foo() returns "B"
// since B is the right most parent contract with function 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();
}
}
总结
日拱一卒。