文章目录

    • 前言
    • 继承的基本概念
    • 继承的基本用法
      • 单继承实现
      • 函数重写(overriding)
    • 构造函数的继承处理
    • 多重继承
    • 抽象合约

前言

继承是面向对象编程中的核心概念之一,Solidity作为一种面向对象的智能合约语言,同样支持继承机制。通过继承,开发者可以实现代码重用、功能扩展,使合约结构更加清晰。本文将详细介绍Solidity中继承的使用方法、特性及最佳实践。

继承的基本概念

继承允许一个合约(子类或派生合约)从另一个合约(父类或基类)继承属性和方法,带来以下优势:

  • 代码重用:避免重复编写相同的属性和方法
  • 方便扩展:在父合约基础上添加新功能
  • 提高可维护性:建立清晰的合约层次关系

在实际开发中,继承使得我们可以使用大量第三方合约库(如OpenZeppelin)来简化开发工作。例如,ERC20标准合约作为父合约,不同的代币合约可以继承它并添加自定义功能。

继承的基本用法

单继承实现

Solidity使用is关键字表示合约的继承关系:

pragma solidity ^0.8.0;
contract Base {uint public a;
}contract Sub is Base {uint public b;constructor() {b = 2;}
}

部署Sub合约后,可以看到它拥有两个属性:a(继承自Base)和b(自身定义)。派生合约会继承父合约内的所有非私有(private)成员:

访问修饰符publicexternalinternalprivate
可被继承

函数重写(overriding)

只有父合约中的虚函数(使用virtual关键字修饰)可以在派生合约中重写,重写函数需要使用override关键字:

pragma solidity >=0.8.0;
contract Base {uint public a;function foo() virtual public {a += 2;}
}contract Sub is Base {function foo() public override {a += 1;}
}

调用Subfoo函数后,a的值会增加1,因为父合约的函数被遮蔽。如果需要在重写函数中调用父合约的实现,可以使用super关键字:

contract Sub is Base {function foo() public override {super.foo(); // 调用父合约的foo函数a += 1;}
}

此时调用foo函数,a的值会先增加2(父合约逻辑),再增加1(当前合约逻辑),总共增加3。

构造函数的继承处理

当派生合约继承父合约时,父合约的构造函数会在派生合约部署时自动执行:

contract Base {uint public a;constructor() {a = 1;}
}contract Sub is Base {uint public b;constructor() {b = 2;}
}

部署Sub合约后,a的值为1(父合约构造函数执行结果),b的值为2(派生合约构造函数执行结果)。

如果父合约构造函数需要参数,有两种传参方式:

  1. 在继承时指定参数:
contract Base {uint public a;constructor(uint _a) {a = _a;}
}contract Sub is Base(1) {uint public b;constructor() {b = 2;}
}
  1. 在派生构造函数中使用修饰符方式调用:
contract Sub is Base {uint public b;constructor() Base(1) {b = 2;}
}

多重继承

Solidity支持多重继承,即一个合约可以从多个父合约继承:

contract Sub is Base1, Base2 {// 实现代码
}

在多重继承中,如果多个父合约之间存在继承关系,必须按照"父合约在前,子合约在后"的顺序书写,否则会编译出错:

contract X {}
contract A is X {}
contract C is A, X {} // 编译出错,X是A的父合约,应放在前面

如果多个父合约定义了同名函数,重写时需要在override后指定所有父合约名:

pragma solidity >=0.8.0;
contract Base1 {function foo() virtual public {}
}contract Base2 {function foo() virtual public {}
}contract Inherited is Base1, Base2 {function foo() public override(Base1, Base2) {}
}

抽象合约

抽象合约是一种特殊的父合约,用于定义合约结构而不被直接部署,使用abstract关键字声明:

abstract contract Base {uint public a;
}

抽象合约可以包含没有具体实现的纯虚函数,纯虚函数声明以;结尾:

pragma solidity >=0.8.0;
abstract contract Base {function get() virtual public; // 纯虚函数,无函数体
}

派生合约必须实现抽象合约中的所有纯虚函数,否则自身也必须声明为抽象合约。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88989.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88989.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88989.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

依赖注入(Dependency Injection, DI)的核心概念和解决的核心问题

核心概念: 依赖注入是一种设计模式,也是实现控制反转(Inversion of Control, IoC) 原则的一种具体技术。其核心思想是: 解耦: 将一个类(客户端)所依赖的其他类或服务(依…

Reactor Schedulers

Reactor 是一个基于响应式编程的库,它提供了丰富的调度器(Schedulers)机制,用于管理异步操作的执行环境。Schedulers 是 Reactor 中的核心组件之一,它们允许开发者灵活地控制操作符和订阅操作在哪个线程上执行&#xf…

设备树引入

一、设备树的基本知识 1、什么是设备树?为什么会有设备树? 2011年,Linux之父Linus Torvalds发现这个问题后,就通过邮件向ARM-Linux开发社区发了一封邮件,不禁的发出了一句“This whole ARM thing is a f*cking pain i…

【数据标注师】3D标注

目录 一、 **3D标注知识体系框架**二、 **五阶能力培养体系**▶ **阶段1:空间认知筑基(2-3周)**▶ **阶段2:核心标注技能深化**▶ **阶段3:复杂场景解决方案**▶ **阶段4:领域深度专精▶ **阶段5&#xff1…

华为HN8145V光猫改华为蓝色公版界面,三网通用,xgpon公版光猫

咸鱼只卖20多元一个,还是xgpon的万兆猫,性价比不错哦 除了没有2.5G网口,其他还行。 改成公版光猫后,运营商是无法纳管光猫,无法后台修改光猫数据及超密。 华为 HN8145V 光猫具有以下特点: 性能方面 高速接…

【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法二)定长滑动窗口+数组

Problem: 438. 找到字符串中所有字母异位词 题目:给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法一&…

PAC 学习框架:机器学习的可靠性工程

PAC(Probably Approximately Correct) 是机器学习理论的核心框架,用于量化学习算法的可靠性。它回答了一个关键问题: “需要多少训练样本,才能以较高概率学到一个近似正确的模型?” 一、PAC 名称拆解 术语…

嵌入式C语言数组:数组/字符数组

1. 数组 1.1 一维数组 数组是一串连续的地址; 数组名是地址常量,代表数组的起始地址; sizeof(数组名) 可得出数组的总内存空间; C 语言对数组不做越界检查,使用时应注意; 数组不…

变长字节的数字表示法vb224

开始 数字有大有小,用多少字节表示呢? 本文描述的方案,采用变化的长度。vb是varying bytes的意思,224是表示它特征的一个数。 第一版: 每个字节8比特,最高的1比特用来表示“是否连续”,0表示…

ByteMD+CozeAPI+Coze平台Agent+Next搭建AI辅助博客撰写平台(逻辑清楚,推荐!)

背景: 现在主流的博客平台AI接入不够完善,如CSDN接入的AI助手不支持多模态数据的交互、稀土掘金的编辑器AI功能似乎还没能很好接入(哈哈哈,似乎在考虑布局什么?) 痛点分析: 用户常常以截图的形式…

【数据标注师】关键词标注

目录 一、 **理解关键词标注的核心逻辑**1. **三大标注原则**2. **关键词类型体系** 二、 **四阶训练体系**▶ **阶段1:基础规则内化**▶ **阶段2:语义浓缩训练**▶ **阶段3:场景化标注策略**▶ **阶段4:工具效率提升** 三、 **五…

for each循环语句

for each循环语句 for each.....nextFor Each 的案例 for each…next 1、循环对象合集 worksheets workbooks range range("区域")selection (选中的区域)usedrange或者currentregion 返回的单元格区域格式: for each 变量名 in 对象集合(范围)循环内容…

基于LQR控制器的六自由度四旋翼无人机模型simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序 4.系统原理简介 5.参考文献 6.完整工程文件 1.课题概述 四旋翼无人机因其结构简单、机动性强和成本低廉等特点,在航拍测绘、物流运输、灾害救援等领域得到广泛应用。六自由度(3维平移3维旋转&#xff0…

vftp centos 离线部署

install_ftp_offline.sh vsftpd-3.0.2-28.el7.x86_64.rpm #!/bin/bash# 一键安装配置vsftpd脚本(开放根目录,禁用chroot)# 安装vsftpd RPM包 echo "正在安装vsftpd..." rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm if [ $? -ne 0 …

【数据标注】事件标注1

目录 **一、 深入理解事件标注的核心概念****二、 系统学习:从理论到实践****1. 吃透标注指南****2. 语言学基础补充****3. 事件结构解析训练** **三、 分阶段实践:从简单到复杂****阶段1:基础标注训练****阶段2:进阶挑战****阶段…

在 Ansys Electronics Desktop 中启用额外的 CPU 内核和 GPU

Ansys Electronics Desktop (AEDT) 可以通过利用多个 CPU 内核和 GPU 加速来显著缩短仿真时间。但是,启用其他计算资源除了基本求解器许可证外,还需要适当的高性能计算 (HPC) 许可证。 默认情况下,基本许可证最多允许使用 4 个内核,而无需任何其他 HPC 许可。借助 Ans…

R语言机器学习算法实战系列(二十六)基于tidymodels的XGBoost二分类器全流程实战

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据准备数据探索转换因子查看属性相关性配对图PCA 可视化缺失值、异常值处理 & 特征标准数据分割构建模型与调参模型评估模型可解释性(变量重要性、SHAP、DALEX)变量…

零基础langchain实战一:模型、提示词和解析器

一,使用python调取大模型api 1,获取api_key 获取api_key 在各个大模型的官网中获取。 2,设置api_key 方式一: 在系统环境中可直接执行python代码:这里以deepseek为例 import os os.environ["DEEPSEEK_API_…

Pytorch分布式通讯为什么要求Tensor连续(Contiguous)

参考资料: https://github.com/pytorch/pytorch/issues/73515 https://www.cnblogs.com/X1OO/articles/18171700 由于业务原因,需要在Pytorch代码中使用分布式通讯来把计算负载平均到多张显卡上。在无数次确认我的业务代码没问题之后,我开始把…

关于前端页面上传图片检测

依赖于前文,linux系统上部署yolo识别图片,远程宿主机访问docker全流程(https://blog.csdn.net/yanzhuang521967/article/details/148777650?spm1001.2014.3001.5501) fastapi把端口暴露出来 后端代码 from fastapi import FastAPI, UploadFile, File, HTTPExcep…