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…...
无公网IP 外网访问 本地部署夫人 hello-algo
hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式,为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo,并结合路由侠内网穿透实现外网访问本地部署…...
系统思考—蝴蝶效应
“个体行为的微小差异,可能在系统中引发巨大且不可预测的结果。” — 诺贝尔经济学得主托马斯谢林 我们常说,小变动带来大影响,这种现象,在复杂系统理论中被称为“蝴蝶效应”:即使极小的变化,也能在动态系…...
钉钉群机器人设置——python版本
钉钉群机器人设置——python版本 应用场景钉钉界面操作程序开发效果展示 应用场景 由于工作需要,很多项目执行程序后出现报错信息无法第一时间收到,因此实时预警对于监控程序还是有必要。(仅个人观点) 参考文档及博客:…...
sem_wait的概念和使用案列
sem_wait 是 POSIX 标准中定义的一个用于同步的函数,它通常用于操作信号量(semaphore)。信号量是一个整数变量,可以用来控制对共享资源的访问。在多线程编程中,sem_wait 常用于实现线程间的同步。 概念 sem_wait 的基…...
深度学习在金融风控中的应用:突破传统模型的瓶颈
深度学习在金融风控中的应用:突破传统模型的瓶颈 金融风险控制(简称“风控”)是现代金融体系中至关重要的一环,关系到金融机构的稳定性、客户的安全以及整体经济的健康运行。近年来,随着深度学习的迅猛发展,传统的风控模型正面临被颠覆的挑战,新的技术手段和思维方式正…...
【Rust自学】15.0. 智能指针(序):什么是智能指针及Rust智能指针的特性
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 15.0.1 指针的基本概念 指针是一个变量在内存中包含的是一个地址,指向另一个数据。 Rust 中最常见的指针是引用,…...
Spring AI 在微服务中的应用:支持分布式 AI 推理
1. 引言 在现代企业中,微服务架构 已成为开发复杂系统的主流方式,而 AI 模型推理 也越来越多地被集成到业务流程中。如何在分布式微服务架构下高效地集成 Spring AI,使多个服务可以协同完成 AI 任务,并支持分布式 AI 推理&#x…...
QT串口通信,实现单个温湿度传感器数据的采集
1、硬件设备 RS485中继器(一进二出),usb转485模块、电源等等 => 累计115元左右。 2、核心代码 #include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::...
EtherCAT主站IGH-- 21 -- IGH之fsm_reboot.h/c文件解析
EtherCAT主站IGH-- 21 -- IGH之fsm_reboot.h/c文件解析 0 预览一 该文件功能`fsm_reboot.c` 文件功能函数预览二 函数功能介绍`fsm_reboot.c` 中主要函数的作用1. `ec_fsm_reboot_init`2. `ec_fsm_reboot_clear`3. `ec_fsm_reboot_single`4. `ec_fsm_reboot_all`5. `ec_fsm_reb…...
使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书
使用 Docker Nginx Certbot 实现自动化管理 SSL 证书 在互联网安全环境日益重要的今天,为站点或应用部署 HTTPS 已经成为一种常态。然而,手动申请并续期证书既繁琐又容易出错。本文将以 Nginx Certbot 为示例,基于 Docker 容器来搭建一个…...
深入理解Linux内核的虚拟地址到物理地址转换机制及缓存优化
在现代计算机系统中,虚拟地址到物理地址的转换是操作系统内存管理的重要组成部分。特别是在基于x86_64架构的Linux系统上,这一转换过程及其相关的缓存机制对系统性能和稳定性至关重要。本文将深入探讨Debian 10上运行Linux 4.19内核时,这些机制的实现细节,特别是页表管理、…...
DeepSeek R1:中国AI黑马的崛起与挑战
文章目录 技术突破:从零开始的推理能力进化DeepSeek R1-Zero:纯RL训练的“自我觉醒”DeepSeek R1:冷启动与多阶段训练的平衡之道 实验验证:推理能力的全方位跃升基准测试:超越顶尖闭源模型蒸馏技术:小模型的…...
MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题
无论在使用QT或者MFC进行界面开发时,都会出现在一个对话框里面存在好多的选项,导致对话框变得非常长或者非常大,就会显现的不美观,在这种情况下通常是添加一个页面的滚动条来解决这个问题,下面我们就来介绍给MFC的对话…...
php接口连接数据库
框架:https://www.thinkphp.cn/doc 创建网站 域名自己写 创建文件夹,“test”拉取框架,地址栏输入 composer create-project topthink/think5.1.* tp5 会自动创建一个tp5文件夹 根目录选择刚刚创建拉框架的文件夹 以test为示例 “D:\test\…...
【卫星通信】链路预算方法
本文介绍卫星通信中的链路预算方法,应该也适用于地面通信场景。 更多内容请关注gzh【通信Online】 文章目录 下行链路预算卫星侧参数信道参数用户侧参数 上行链路预算链路预算计算示例 下行链路预算 卫星侧参数 令卫星侧天线数为 M t M_t Mt,每根天线…...
解析静态链接
文章目录 静态链接空间与地址分配相似段合并虚拟地址分配符号地址确定符号解析与重定位链接器优化重复代码消除函数链接级别静态库静态链接优缺点静态链接 一组目标文件经过链接器链接后形成的文件即可执行文件,如果没有动态库的加入,那么这个可执行文件被加载后无需再进行重…...
【C语言】函数递归
目录 1. 什么是递归 1.1 递归的思想: 1.2 递归的限制条件 2. 递归的限制条件 2.1 举例1:求n的阶乘 2.1.1 分析和代码实现 2.1.2 画图推演 2.2 举例2:顺序打印⼀个整数的每⼀位 2.2.1 分析和代码实现 2.2.2 画图推演 3. 递归与迭代…...
从0到1:C++ 开启游戏开发奇幻之旅(二)
目录 游戏开发核心组件设计 游戏循环 游戏对象管理 碰撞检测 人工智能(AI) 与物理引擎 人工智能 物理引擎 性能优化技巧 内存管理优化 多线程处理 实战案例:开发一个简单的 2D 射击游戏 项目结构设计 代码实现 总结与展望 游戏…...
线性调整器——耗能型调整器
线性调整器又称线性电压调节器,以下是关于它的介绍: 基本工作原理 线性调整器的基本电路如图1.1(a)所示,晶体管Q1(工作于线性状态,或非开关状态)构成一个连接直流源V和输出端V。的可调电气电阻,直流源V由60Hz隔离变压器(电气隔离和整流&#…...
精灵图的知识
精灵图的使用...
C语言编译过程全面解析
今天是2025年1月26日,农历腊月二十七,一个距离新春佳节仅一步之遥的日子。城市的喧嚣中,年味已悄然弥漫——能在这个时候坚持上班的人,真可称为“牛人”了吧,哈哈。。。。 此刻,我在重新审视那些曾被遗忘的…...
谈谈出国留学文书PS写作中的注意事项
在上期,小编介绍出国留学文书PS正文写作的几个可以采用的技巧。总之在正文的写作中,要避免将PS写成个人简历的repetition。也就是说不要将你目前所做的事情再次在PS中重述一遍,留学PS不是对你的工作经历或者学习经历的重复,而是需…...
React 封装高阶组件 做路由权限控制
React 高阶组件是什么 官方解释∶ 高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。 高阶组件(HOC)就是一个函数&…...
汇编基础语法及其示例
1.汇编指令 1.1汇编指令的基本格式 <opcode>{<cond>}{s} <Rd> , <Rn> , <shifter_operand> <功能码>{<条件码>}{cpsr影响位} <目标寄存器> , <第一操作寄存器> , <第二操作数> 注:第一操作寄存器…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证10)
基于Cookie传递token的主要思路是通过用户身份验证后,将生成的token保存到Response.Cookies返回客户端,后续客户端访问服务接口时会自动携带Cookie到服务端以便验证身份。之前一直搞不清楚的是服务端程序如何从Cookie读取token进行认证(一般都…...
上位机知识篇---GitGitHub
文章目录 前言Git&GitHub是什么?GitGitHub Git和GitHub的区别定位功能使用方式开源协作 Git常用命令操作1. 配置2. 仓库操作3. 文件操作4. 分支与合并5.远程操作6.撤销更改7.查看历史 GitHub常用操作1.创建仓库2.Fork仓库3.Pull Request4.Issue跟踪5.代码审查 G…...
Java 分布式与微服务架构:现代企业应用开发的新范式
Java学习资料 Java学习资料 Java学习资料 一、引言 在当今数字化时代,企业应用面临着越来越高的性能、可扩展性和灵活性要求。传统的单体架构在应对大规模用户访问、复杂业务逻辑和频繁的功能迭代时,逐渐暴露出诸多问题。Java 分布式与微服务架构应运…...
Ollama 运行从 ModelScope 下载的 GGUF 格式的模型
本文系统环境 Windows 10 Ollama 0.5.7 Ollama 是什么? Ollama 可以让你快速集成和部署本地 AI 模型。它支持各种不同的 AI 模型,并允许用户通过简单的 API 进行调用 Ollama 的安装 Ollama 官网 有其下载及安装方法,非常简便 但如果希…...
Day07:缓存-数据淘汰策略
Redis的数据淘汰策略有哪些 ? (key过期导致的) 在redis中提供了两种数据过期删除策略 第一种是惰性删除,在设置该key过期时间后,我们不去管它,当需要该key时,我们再检查其是否过期,如果过期&…...
