Copyright © 2022-2024 aizws.net · 网站版本: v1.2.6·内部版本: v1.23.3·
页面加载耗时 0.00 毫秒·物理内存 68.1MB ·虚拟内存 1300.5MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
Solidity 语言提供了对合约继承的支持,而且支持多重继承。
Solidity 语言的多重继承采用线性继承方式。继承顺序很重要,判断顺序的一个简单规则是按照“最类似基类”到“最多派生”的顺序指定基类。
第一种情况:基类 X,Y 没有继承关系,派生类 Z 继承了 X,Y。
X Y / \ \ / Z
多重继承示例
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract X{ function x() external pure returns(string memory) { return "x"; } } contract Y{ function y() external pure returns(string memory) { return "y"; } } contract Z is X,Y{ function z() external pure returns(string memory) { return "z"; } }
派生合约 Z 继承了 X 的 x() 和 Y 的 y(),另外还定义了自己的函数 z()。
第二种情况:派生类 Y 继承了基类 X,派生类 Z 同时继承了 X,Y。
X / \ Y | \ / Z
这种情况下,我们按照线性继承原则,理清继承顺序:X,Y,Z。
多重继承示例
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract X{ function foo() external pure virtual returns(string memory) { return "x foo"; } function bar() external pure virtual returns(string memory) { return "x bar"; } function x() external pure returns(string memory) { return "x"; } } contract Y is X{ function foo() external pure virtual override returns(string memory) { return "y foo"; } function bar() external pure virtual override returns(string memory) { return "y bar"; } function y() external pure returns(string memory) { return "y"; } } contract Z is X,Y{ function foo() external pure override(X,Y) returns(string memory) { return "y foo"; } function bar() external pure override(X,Y) returns(string memory) { return "z bar"; } function z() external pure returns(string memory) { return "z"; } }
按照线性继承顺序,Z 继承了 Y,Y 继承了X,那么 Z 的写法是 Z is X,Y。如果写成 Z is Y,X,编译器就会报错。
Z 的方法 foo() ,覆盖了 X 和 Y 的方法 foo() ,所以需要写为 override(X,Y)。
X / \ Y A | | | B \ / Z
这种情况下,我们按照线性继承原则,理清继承顺序:X,Y,A,B,Z。
Solidity 多重继承的构造函数有两种形式:1. 已知基类初始化参数如果我们已经知道基类初始化参数,那么就可以在派生类的继承声明中,直接传递参数给基类的构造函数。// SPDX-License-Id ...