solidity高阶 -- 线性继承
Solidity是一种面向合约的高级编程语言,用于编写智能合约。在Solidity中,多线继承是一个强大的特性,允许合约从多个父合约继承属性和方法。本文将详细介绍Solidity中的多线继承,并通过不同的实例展示其使用方法和注意事项。
在Solidity语言中,派生合约和基础合约是多线继承中的两个重要概念。它们定义了合约之间的继承关系,帮助开发者实现代码复用和功能扩展。下面将详细解释这两个概念之后我们再来展示线性继承的用法。
注意:使用继承时请确保代码的正确性,以防丢失个人财产,在这里友情提示您,不要复制来源不明的solidity代码并进行部署。
本文为自己梳理总结,如有不足还请指出,感谢包容。
学习更多solidity知识请访问 Github -- solidity基础 ,更多实例在 Smart contract
基础合约(Base Contract)
基础合约是被其他合约继承的合约。它定义了一些基本的属性和方法,这些属性和方法可以被派生合约继承和使用。基础合约通常包含一些通用的功能,这些功能可以在多个派生合约中复用。
例如,以下是一个基础合约X
的定义:
contract X {function foo() public pure virtual returns (string memory) {return "X";}function bar() public pure virtual returns (string memory) {return "X";}function x() public pure returns (string memory) {return "X";}
}
在这个例子中,X
合约定义了三个方法:foo
、bar
和x
。这些方法可以在派生合约中被继承和使用。
派生合约(Derived Contract)
派生合约是从基础合约继承而来的合约。它继承了基础合约的属性和方法,并可以添加新的属性和方法,或者重写继承的方法以实现特定的功能。派生合约可以进一步继承其他派生合约,形成多层继承关系。
例如,以下是一个派生合约Y
的定义,它继承自基础合约X
:
solidity复制
contract Y is X {function foo() public pure virtual override returns (string memory) {return "Y";}function bar() public pure virtual override returns (string memory) {return "Y";}function y() public pure returns (string memory) {return "Y";}
}
在这个例子中,Y
合约继承了X
合约的所有方法,并重写了foo
和bar
方法。此外,Y
合约还添加了一个新的方法y
。
多线继承中的派生合约和基础合约
在多线继承中,一个派生合约可以继承多个基础合约。这种情况下,派生合约需要明确指定重写的方法来自哪些基础合约,以避免方法解析的歧义。
例如,以下是一个派生合约Z
的定义,它继承自基础合约X
和Y
:
contract Z is X, Y {function foo() public pure override(X, Y) returns (string memory) {return "Z";}function bar() public pure override(X, Y) returns (string memory) {return "Z";}
}
在这个例子中,Z
合约继承了X
和Y
合约的所有方法,并重写了foo
和bar
方法。通过使用override(X, Y)
,Z
合约明确指定了重写的方法来自X
和Y
合约。
总结
-
基础合约:被其他合约继承的合约,定义了一些基本的属性和方法,这些属性和方法可以被派生合约继承和使用。
-
派生合约:从基础合约继承而来的合约,继承了基础合约的属性和方法,并可以添加新的属性和方法,或者重写继承的方法以实现特定的功能。
通过合理使用基础合约和派生合约,可以实现代码复用和功能扩展,提高智能合约的开发效率和可维护性。
多线继承的基本概念
在Solidity中,合约可以继承多个父合约,形成多线继承关系。多线继承允许合约继承多个父合约的属性和方法,从而实现代码复用和功能扩展。多线继承的基本语法如下:
contract Child is Parent1, Parent2 {// 合约内容
}
在多线继承中,父合约的顺序非常重要。Solidity会按照父合约的顺序进行方法解析和调用。如果多个父合约中存在同名方法,Solidity会按照父合约的顺序选择第一个父合约中的方法。
多线继承的注意事项
-
父合约顺序:在多线继承中,父合约的顺序非常重要。Solidity会按照父合约的顺序进行方法解析和调用。如果多个父合约中存在同名方法,Solidity会按照父合约的顺序选择第一个父合约中的方法。
-
方法重写:在派生合约中,如果需要重写父合约的方法,必须使用
override
关键字,并明确指定重写的方法来自哪些父合约。 -
构造函数:在多线继承中,派生合约的构造函数会调用所有父合约的构造函数。父合约的构造函数调用顺序与父合约的继承顺序相同。
多线继承的实例
示例1:基础合约
首先,我们定义一个基础合约X
,它包含两个方法foo
和bar
,以及一个方法x
:
contract X {function foo() public pure virtual returns (string memory) {return "X";}function bar() public pure virtual returns (string memory) {return "X";}function x() public pure returns (string memory) {return "X";}
}
示例2:中间合约
接下来,我们定义一个中间合约Y
,它继承自X
,并重写了foo
和bar
方法,同时添加了一个新的方法y
:
contract Y is X {function foo() public pure virtual override returns (string memory) {return "Y";}function bar() public pure virtual override returns (string memory) {return "Y";}function y() public pure returns (string memory) {return "Y";}
}
示例3:派生合约
最后,我们定义一个派生合约Z
,它继承自X
和Y
,并重写了foo
和bar
方法:
contract Z is X, Y {function foo() public pure override(X, Y) returns (string memory) {return "Z";}function bar() public pure override(X, Y) returns (string memory) {return "Z";}
}
在Z
合约中,我们使用了override(X, Y)
来明确指定重写的方法来自X
和Y
合约。这样可以避免方法解析的歧义。
不同实例的展示
实例1:多线继承中的方法调用
在以下代码中,我们展示了多线继承中的方法调用:
contract A {function foo() public pure virtual returns (string memory) {return "A";}
}contract B {function foo() public pure virtual returns (string memory) {return "B";}
}contract C is A, B {function foo() public pure override(A, B) returns (string memory) {return "C";}
}
在C
合约中,我们重写了foo
方法,并明确指定了重写的方法来自A
和B
合约。调用C
合约的foo
方法时,会返回"C"
。
实例2:多线继承中的构造函数调用
在以下代码中,我们展示了多线继承中的构造函数调用:
contract A {constructor() public {// A的构造函数}
}contract B {constructor() public {// B的构造函数}
}contract C is A, B {constructor() public {// C的构造函数}
}
在C
合约中,构造函数会调用A
和B
的构造函数。构造函数的调用顺序与父合约的继承顺序相同。
整体代码
//多线继承
//从越基础的合约到派生之间的合约有一个顺序关系
//把继承最少的合约放在更前面一些//x最基础,y在中间,z是派生的// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract X {function foo() public pure virtual returns (string memory) {return "x";}function bar() public pure virtual returns (string memory) {return "X";}function x() public pure returns (string memory) {return "X";}
}
//y继承了x,y也有foo和bar,并且标记了重写,还有个自己的函数Y
contract Y is X {function foo() public pure virtual override returns (string memory) {return "Y";}function bar() public pure virtual override returns (string memory) {return "Y";}function y() public pure returns (string memory) {return "Y";}
}contract Z is X,Y {function foo() public pure override(X,Y) returns (string memory) {return "Z";}
//()里的xy循序正常无妨,但是编写的时候需要注意先后顺序function bar() public pure override(X,Y) returns (string memory) {return "Z";}
}
刚发完没多久就发现已经有了很多浏览,感谢每一刻正在奋斗的你自己,现在是2025年的除夕夜,不知道以后你看到这篇文章的时候我还有没有从事IT行业,不管怎样都很感谢这一路走来的所有人,尤其是高老师,他是独一无二的老师。
感谢您看到这里,新年快乐!祝您新的一年学业顺利,事业有成,平安健康快乐每一天。
相关文章:
solidity高阶 -- 线性继承
Solidity是一种面向合约的高级编程语言,用于编写智能合约。在Solidity中,多线继承是一个强大的特性,允许合约从多个父合约继承属性和方法。本文将详细介绍Solidity中的多线继承,并通过不同的实例展示其使用方法和注意事项。 在Sol…...
国内外大语言模型领域发展现状与预期
在数字化浪潮中,大语言模型已成为人工智能领域的关键力量,深刻影响着各个行业的发展轨迹。下面我们将深入探讨国内外大语言模型领域的发展现状以及未来预期。 一、发展现状 (一)国外进展 美国的引领地位:OpenAI 的 …...
【Leetcode 热题 100】416. 分割等和子集
问题背景 给你一个 只包含正整数 的 非空 数组 n u m s nums nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 数据约束 1 ≤ n u m s . l e n g t h ≤ 200 1 \le nums.length \le 200 1≤nums.length≤200 1 ≤ n u m s [ i ] ≤ …...

C语言------数组从入门到精通
1.一维数组 目标:通过思维导图了解学习一维数组的核心知识点: 1.1定义 使用 类型名 数组名[数组长度]; 定义数组。 // 示例: int arr[5]; 1.2一维数组初始化 数组的初始化可以分为静态初始化和动态初始化两种方式。 它们的主要区别在于初始化的时机和内存分配的方…...

物管系统赋能智慧物业管理提升服务质量与工作效率的新风潮
内容概要 在当今的物业管理领域,物管系统的崛起为智慧物业管理带来了新的机遇和挑战。这些先进的系统能够有效整合各类信息,促进数字化管理,从而提升服务质量和工作效率。通过物管系统,物业管理者可以实时查看和分析各种数据&…...

2024年记 | 凛冬将至
放弃幻想,准备斗争! 考研or就业? 上大学以来,考研上名校在我的心里一直是一颗种子,2024年初,当时的想法是考研和就业两手抓。买了张宇的高数现代,想要死磕! 也记了挺多笔记... 如果…...
MySQL数据导入与导出
在现代软件开发中,数据管理是一个重要的核心环节,而数据库则是进行数据管理的主要工具。MySQL 作为一款开源的关系型数据库管理系统,被广泛应用于企业和个人开发项目中。对于学习编程的初学者或是自学者来说,掌握 MySQL 的基本操作尤为重要,尤其是数据的导入与导出功能。这…...

NoSQL与SQL比较
1.认识NoSQL NoSql可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为非关系型数据库。 1.1.结构…...
Ceph:关于Ceph 中使用 RADOS 块设备提供块存储的一些笔记整理(12)
写在前面 准备考试,整理 ceph 相关笔记博文内容涉及使用 RADOS 块设备提供块存储理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波…...
Android SystemUI——最近任务列表启动(十八)
前面分析了初始化涉及到的关键类,系统启动后会启动 SystemUI 进程,然后进行一系列初始化,接下来看一下进入 Recents 的流程。我们主要分析最近任务应用列表的启动与显示。 一、最近任务启动 关于手势或 Key 按键触发这一块逻辑处理入口都是在 PhoneWindowManager,咱们从 R…...

数据结构课程设计(三)构建决策树
3 决策树 3.1 需求规格说明 【问题描述】 ID3算法是一种贪心算法,用来构造决策树。ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的…...

从ChatGPT热潮看智算崛起
2025年1月7日,科智咨询发布《2025年IDC产业七大发展趋势》,其中提到“ChatGPT开启生成式AI热潮,智能算力需求暴涨,算力供给结构发生转变”。 【图片来源于网络,侵删】 为何会以ChatGPT发布为节点呢?咱们一起…...
基于PyQt设计的智能停车管理系统
文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】设计意义【4】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】VSCODE【2】python【3】ptqt【4】HyperLPR31.5 参考文献二、安装Python环境1.1 环境介绍**1.2 Python版本介…...

http的请求体各项解析
一、前言 做Java开发的人员都知道,其实我们很多时候不单单在写Java程序。做的各种各样的系统,不管是PC的 还是移动端的,还是为别的系统提供接口。其实都离不开http协议或者https 这些东西。Java作为编程语言,再做业务开发时&#…...
【linux】Linux 常见目录特性、权限和功能
目录特性默认权限主要功能/用途/根目录,所有目录的起点755文件系统的顶层目录,包含所有其他子目录和文件/bin基础二进制命令目录(系统启动和修复必需的命令)755存放所有用户可用的基本命令(如 ls, cp, bash 等…...

创作三载·福启新章2025
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言机缘收获日常憧憬 总结 前言 在2022年01月26日,我踏上了技术创作的征…...

RoboMaster- RDK X5能量机关实现案例(一)识别
作者:SkyXZ CSDN:https://blog.csdn.net/xiongqi123123 博客园:https://www.cnblogs.com/SkyXZ 在RoboMaster的25赛季,我主要负责了能量机关的视觉方案开发,目前整体算法已经搭建完成,实际方案上我使用的上…...
Python帝王學集成-母稿
引用:【【全748集】这绝对是2024最全最细的Python全套教学视频,七天看完编程技术猛涨!别再走弯路了,从零基础小白到Python全栈这一套就够了!-哔哩哔哩】 https://b23.tv/lHPI3XV 语法基础 Python解释器与pycharm编辑器安装 - 定义:Python解释器负责将Python代码转换为计…...
安全漏洞扫描与修复系统的高质量技术详解
安全漏洞扫描与修复系统的高质量技术详解 在当今的数字化时代,网络安全已成为企业和个人不可忽视的重要议题。安全漏洞扫描与修复系统作为保障网络安全的关键环节,其重要性日益凸显。本文将深入探讨安全漏洞扫描与修复系统的原理、流程、工具选择以及实…...
JavaScript反爬技术解析与应对
JavaScript 反爬技术解析与应对 前言 在当今 Web 爬虫与数据抓取的生态环境中,网站运营方日益关注数据安全与隐私保护,因此逐步采用多种反爬技术来限制非授权访问。本文从 JavaScript 角度出发,深入剖析主流反爬策略的技术原理,…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...