Solidity之旅(十)OOP-抽象合约

2023-12-16

抽象合约(abstractcontract)

前文在讲合约继承的基类构造函数的参数时,有提到抽象合约,也就是说,如果派生合约未能给其继承的基合约指定构造函数参数时,那么,该派生合约必须声明为抽象合约(abstractcontract)。

我们知道Java中抽象类的定义,其一抽象类不能实例化,其二是抽象类中可以拥有抽象方法(是一种没有方法体的、只有方法签名的方法。)

而在Solidity中的抽象合约与Java的抽象类有异曲同工之妙。即假使合约中至少有一个函数没有实现(没有方法体,只有方法签名的方法),那么便将该合约定义为抽象合约(abstractcontract)。当然咯,前文说到继承提到的,派生合约未能给其基合约的构造函数传递指定参数,这时,该合约便只能声明为抽象的。

在Solidity0.8.x版本以上,抽象合约的抽象函数需加上virtual修饰,而对于的派生合约中的函数实现也得加上override修饰,否则编译过不了。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

//base contract
abstract contract Animal  {
  function eat() virtual public ;
}

contract Bird is Animal {
   function eat() override public {

   }
}

图片

假使派生合约未能给定所有基类的制定参数(基类构造函数的参数),那该合约也必须声明为抽象的。

图片

解决上图所出现的问题,有两种方式,要么派生合约contractSnake给定所有基类构造函数的制定参数;要么将派生合约Snake声明为抽象(abstract)的。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

//base contract
contract Animal  {
  string public name;
   constructor(string memory _name){
      name = _name;
   }
}
//爬行动物是动物
contract Reptile {
   string public Rname;
   constructor(string memory _name){
      Rname = _name;
   }
}

abstract contract Snake is Reptile,Animal {
   //这是一只眼镜蛇 多个基类使用空格隔开
   constructor()  Animal("cobra"){}
}

图片

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

//base contract
contract Animal  {
  string public name;
   constructor(string memory _name){
      name = _name;
   }
}
//爬行动物是动物
contract Reptile {
   string public Rname;
   constructor(string memory _name){
      Rname = _name;
   }
}

contract Snake is Reptile,Animal {
   //这是一只眼镜蛇 多个基类使用空格隔开
   constructor() Reptile("diba") Animal("cobra"){}
}


// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

//base contract
contract Animal  {
  string public name;
   constructor(string memory _name){
      name = _name;
   }
}
//爬行动物是动物
contract Reptile {
   string public Rname;
   constructor(string memory _name){
      Rname = _name;
   }
}

contract Snake is Reptile,Animal {
   //这是一只眼镜蛇 多个基类使用空格隔开
   constructor() Reptile("diba") Animal("cobra"){}
}

图片

若派生合约继承自抽象合约,而并没有去实现抽象合约中的抽象函数,那么,该合约依然需要标记为抽象(abstract)的。

抽象合约将合约的定义与其实现脱钩,从而提供了更好的可扩展性和自文档性,并消除了代码重复。

版权声明:本文为CSDN博主「甄齐才」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/coco2d_x2014/article/details/128353622

文章来源:CSDN博主「甄齐才」

文章原标题:《玩以太坊链上项目的必备技能(OOP-抽象合约-Solidity之旅十)》

旨在传播区块链相关技术,如有侵权请与我们联系删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Solidity之旅(十)OOP-抽象合约 的相关文章

  • python在车载电子测试方面的应用笔记【1】

    文章目录 在DataFrame中某列插入数据 并根据另一列查找是否存在某个字符串完全一样 在另一列插入对应数据的功能 删除DataFrame某列数据长度大于6的数据 使用 PyInstaller 打包成一个独立的 exe 文件 通过检索空格

随机推荐

  • 通过kubeadm方式安装k8s

    虚拟机最少是 2 core master内存最小3G node内存最小2G 要求的Docker版本是18 03 如果不是安装的docker ce 版本是过旧的 可以选择删除后重新安装 也可以重新创建一个虚拟机执行以下命令 简单方法 使用ma
  • Docker build 无法解析域名

    报错 Docker build 无法解析域名 报错 ERROR 2 12 RUN curl o etc yum repos d CentOS Base repo https mirrors aliyun com repo Centos 7
  • 安装 运行 gemmini 和chipyard

    安装gemmini 和chipyard过程 安装版本 chipyard 版本是1 8 1 gemmini版本0 7 0 tip 如果在base里安装conda lock觉得缓慢 可以新建新的环境时就指定安装conda lock conda
  • GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

    这章是接上一章 使用 RPC包 序列化中没有详细去讲 因为这一块需要看的和学习的地方很多 并且这一块是RPC中可以说是最重要的一块 也是性能的重要影响因子 今天这篇主要会讲其使用方式 文章目录 Protocol Buffers V3 背景以
  • GoLong的学习之路,进阶,微服务之使用,RPC包(包括源码分析)

    今天这篇是接上上篇RPC原理之后这篇是讲如何使用go本身自带的标准库RPC 这篇篇幅会比较短 重点在于上一章对的补充 文章目录 RPC包的概念 使用RPC包 服务器代码分析 如何实现的 总结 Server还提供了两个注册服务的方法
  • 车载以太网笔记

    文章目录 以太网协议分层 协议 中间设备 子网掩码 物理层 测试 内容比较杂 后续会整理 以太网协议分层 协议 中间设备
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)

    WebAppDbTest 项目准备 项目准备 1 net cli 创建项目 2 nuget 包引用和项目结构 2 1 项目添加相关 nuget 包 2 2 WebAppDbTest 项目结构 3 项目代码说明
  • ETL.NET 助力海量数据轻松处理

    ETL NET 助力海量数据轻松处理 什么是 ETL EtlT About ETL About EtlT 谈谈 ETL 作用 ETL 对企业的作用 ETL 对个人职业发展的作用 ETL NET 介绍
  • 一篇能让你彻底搞明白前复权、后复权、不复权的好文

    当我们打开炒股软件看K线走势图时 点击鼠标右键会看到有前复权 后复权 不复权三种模式形态 有的股票三种模式下形态差别很大 选错模式 甚至有的股票用不复权处在底部 用前复权处在顶部 股票位置的高低都分不清 又怎么能选好股票呢 今天用最容易理解
  • 让同事高血压的8个Bug操作集锦

    来源 juejin cn post 7222676935147651132 前言 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例八 前言 本文的选题来源于一周前我的一次崩溃 当时各种压
  • 机器翻译:跨越语言边界的智能大使

    导言 机器翻译作为人工智能领域的瑰宝 正在以前所未有的速度和精度 为全球沟通拓展新的可能性 本文将深入研究机器翻译的技术原理 应用场景以及对语言交流未来的影响 1 简介 机器翻译是一项致力于通过计算机自动将一种语言的文本翻译成另一种语言的技
  • 【UE 材质】任务目标点效果

    效果 步骤 1 新建一个工程 创建一个Basic关卡 2 新建一个材质 这里命名为 M GoalPoint 打开 M GoalPoint 设置混合模式为 半透明 勾选 双面 在材质图表中添加如下节点 此时预览效果如下 继续添加如下节点 此时
  • 外贸行业怎么跟进客户?

    外贸行业怎么跟进客户 建立一个完善的跟进系统需要人性化关怀和高效的技术支持 人性化关怀 是指以客户为中心 关注客户的需求和情感 建立真诚 个性化的关系 高效的技术支持 则是指利用技术和工具来提高跟进效率和服务质量 也就是我们接下来要重点介绍
  • 期末备考 |《现代控制理论》期末备考资料包来啦!

    写在前面 不知不觉又到了学期的末尾 不知道各位计算机er的 专业课复习得怎么样了呢 为了帮助大家更好地 备战期末 从今天开始 岛主将持续为大家更新 计算机期末备考资料 为同学们的绩点护航 今天岛主为大家带来的是 现代控制理论 期末备考资料包
  • java 生成 UUID

    java 生成 UUID 1 生成 UUID import cn hutool core util IdUtil public class IdUtilTest public static void main String args 获取随
  • 大语言模型:开启自然语言处理新纪元

    导言 大语言模型 如GPT 3 Generative Pre trained Transformer 3 标志着自然语言处理领域取得的一项重大突破 本文将深入研究大语言模型的基本原理 应用领域以及对未来的影响 1 简介 大语言模型是基于深度
  • 数据库基础知识

    一 数据库 1 数据库分类 关系型数据库 RDMS最常用 以数据表为核心 非关系型数据库 不存在表的概念 2 常见数据库 Oracle 适用于项目结构庞大的数据库 例如 银行 电信等 MariaDB 与MySQL同源 起源于同一个团队 SQ
  • 波奇学Linux:父子进程和进程状态

    vim编辑器 编写一个程序模拟进程 在vim中查看sleep函数 底行模式输入 写个Makefile自动运行 波奇学Linux yum和vim CSDN博客 运行程序 PID和PPID 查看进程目录信息 实际有过滤出来有两个 一个进程本身一
  • 期末备考 |《数学物理方法》期末备考资料包来啦!

    写在前面 不知不觉又到了学期的末尾 不知道各位计算机er的 专业课复习得怎么样了呢 为了帮助大家更好地 备战期末 从今天开始 岛主将持续为大家更新 计算机期末备考资料 为同学们的绩点护航 今天岛主为大家带来的是 数学物理方法 期末备考资料包
  • Solidity之旅(十)OOP-抽象合约

    抽象合约 abstractcontract 前文在讲合约继承的基类构造函数的参数时 有提到抽象合约 也就是说 如果派生合约未能给其继承的基合约指定构造函数参数时 那么 该派生合约必须声明为抽象合约 abstractcontract 我们知道