全部教程·
区块链·
Solidity
[目录]
·
Solidity 多重继承
Solidity 教程
Solidity 开发环境搭建
Solidity 基础语法
Solidity 编译运行
Solidity 代码注释
Solidity SPDX 语法
Solidity 数据类型
Solidity 变量
Solidity 变量 Solidity 特殊变量 Solidity 变量默认值 Solidity 变量作用域 Solidity 常量Solidity 运算符
Solidity 运算符 Solidity 算术运算符 Solidity 比较运算符 Solidity 逻辑运算符 Solidity 位运算符 Solidity 赋值运算符 Solidity 条件运算符Solidity 条件语句
Solidity 条件语句 Solidity if语句 Solidity if…else 语句 Solidity if…else ifSolidity 循环语句
Solidity 循环语句 Solidity while 循环 Solidity do 循环 Solidity for 循环 break 与 continueSolidity 复杂数据
Solidity 字符串 Solidity 数组 Solidity 结构体 Solidity 映射 Solidity 枚举 Solidity 类型转换Solidity 数据位置
Solidity 数据位置 Solidity 变量数据位置 Solidity 赋值数据位置Solidity 函数
Solidity 函数 Solidity 函数返回值 Solidity pure函数 Solidity view函数 Solidity 构造函数 solidity 函数修改器 Solidity 函数重载 Solidity 数学函数 Solidity 加密函数Solidity 进阶编程
Solidity 事件 Solidity 不可变量 Solidity 日志 Solidity 继承 Solidity 多重继承 多重继承的构造函数 Solidity 调用父类函数 Solidity 异常处理 Solidity 编程风格 Solidity 访问权限 Solidity 存储位置 Solidity 引用类型 Solidity 值类型 Solidity 值类型与引用类型 Solidity 合约结构 Solidity 编写智能合约 Solidity delete Solidity 0.6 重大变化 Solidity transfer 转账 Solidity transfer send Solidity 单位 Solidity constant Solidity this & sender Solidity address Solidity 众筹智能合约 Solidity interface solidity gas使用模式 Solidity 常见编译错误 Solidity 调用合约 Solidity 支付Eth Solidity fallback Solidity receive Solidty 钱包合约 Solidity 发送Eth Solidity 自毁合约 Solidity 哈希算法 Solidity 工厂合约 Solidity 库合约 Solidity 权限控制合约 Solidity 验证签名
Solidity 教程
Solidity 开发环境搭建
Solidity 基础语法
Solidity 编译运行
Solidity 代码注释
Solidity SPDX 语法
Solidity 数据类型
Solidity 变量
Solidity 变量 Solidity 特殊变量 Solidity 变量默认值 Solidity 变量作用域 Solidity 常量Solidity 运算符
Solidity 运算符 Solidity 算术运算符 Solidity 比较运算符 Solidity 逻辑运算符 Solidity 位运算符 Solidity 赋值运算符 Solidity 条件运算符Solidity 条件语句
Solidity 条件语句 Solidity if语句 Solidity if…else 语句 Solidity if…else ifSolidity 循环语句
Solidity 循环语句 Solidity while 循环 Solidity do 循环 Solidity for 循环 break 与 continueSolidity 复杂数据
Solidity 字符串 Solidity 数组 Solidity 结构体 Solidity 映射 Solidity 枚举 Solidity 类型转换Solidity 数据位置
Solidity 数据位置 Solidity 变量数据位置 Solidity 赋值数据位置Solidity 函数
Solidity 函数 Solidity 函数返回值 Solidity pure函数 Solidity view函数 Solidity 构造函数 solidity 函数修改器 Solidity 函数重载 Solidity 数学函数 Solidity 加密函数Solidity 进阶编程
Solidity 事件 Solidity 不可变量 Solidity 日志 Solidity 继承 Solidity 多重继承 多重继承的构造函数 Solidity 调用父类函数 Solidity 异常处理 Solidity 编程风格 Solidity 访问权限 Solidity 存储位置 Solidity 引用类型 Solidity 值类型 Solidity 值类型与引用类型 Solidity 合约结构 Solidity 编写智能合约 Solidity delete Solidity 0.6 重大变化 Solidity transfer 转账 Solidity transfer send Solidity 单位 Solidity constant Solidity this & sender Solidity address Solidity 众筹智能合约 Solidity interface solidity gas使用模式 Solidity 常见编译错误 Solidity 调用合约 Solidity 支付Eth Solidity fallback Solidity receive Solidty 钱包合约 Solidity 发送Eth Solidity 自毁合约 Solidity 哈希算法 Solidity 工厂合约 Solidity 库合约 Solidity 权限控制合约 Solidity 验证签名Solidity 多重继承
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 多重继承的构造函数
Solidity 多重继承的构造函数有两种形式:1. 已知基类初始化参数如果我们已经知道基类初始化参数,那么就可以在派生类的继承声明中,直接传递参数给基类的构造函数。// SPDX-License-Id ...
AI 中文社