当前位置: 首页 > news >正文

solidity多态【很重要】

多态是面向对象编程(OOP)的一个核心概念,允许不同类的对象被视为同一类型的实例,并根据实际类型来响应相同的方法调用。

这意味着同一个接口可以用来引用属于不同类的对象,而这些对象可以有自己的方法实现,这些实现可以在运行时被动态地调用,而不是在编译时。多态性增加了程序的灵活性和可扩展性。

多态有两种主要形式:

  1. 编译时多态(静态多态)
    编译时多态,也称为静态多态,是通过方法重载和运算符重载实现的。

这意味着在编译时就确定了将要执行哪个方法,通常依赖于方法的参数列表(方法的名称相同,但参数的数量或类型不同)。

方法重载(Overloading)

在同一个类中定义多个同名方法,但是它们的参数列表不同(参数的数量或类型不同)。

根据传递给方法的参数类型和数量,编译器决定调用哪个方法。


  1. 运行时多态(动态多态)
    运行时多态,也称为动态多态,是通过方法重写(Override)实现的,它允许子类提供一个特定于自己的实现,覆盖父类的方法。

在这种情况下,到底调用哪个方法是在程序运行时根据对象的实际类型动态决定的。

方法重写(Overriding)

子类重写继承自父类的方法。当通过父类引用调用该方法时,实际调用的方法取决于对象的实际类型。

这是通过使用虚方法(virtual methods)和方法重写(method overriding)来实现的,其中子类的方法会覆盖父类的同名方法。

基本语法

在Solidity中,多态性通过继承和函数重写实现。

子类使用override关键字来指明它重写了父类中的函数。

父类可以使用virtual 关键字来指名他允许子类,重写方法。

基本使用方式 - 方法重载

这是通过使用虚方法(virtual methods)和方法重写(method overriding)来实现的,其中子类的方法会覆盖父类的同名方法。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;contract BaseContract {function name() public pure virtual returns (string memory) {return "BaseContract name";}
}contract Xm is BaseContract {function name() public pure override returns (string memory) {return "Xm name";}
}contract Xl is BaseContract {function name() public pure override returns (string memory) {return "Xl name";}
}

修饰器重载

函数修改器可以相互重载。 这与 函数重载 的工作方式相同(除了对修改器没有重载)。

virtual 关键字必须用在被重载的修改器上, override 关键字必须用在重载的修改器上:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract A {modifier test() virtual{_;}
}contract B is A{modifier test() override {_;}
}

多重继承的重载

在多重继承的情况下,必须明确指定所有的直接基类合约。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract A {function getValue() public pure virtual returns (string memory) {return "A";}
}contract B {function getValue() public pure virtual returns (string memory) {return "B";}
}contract C is B,A  {function getValue() public pure override( B,A) returns (string memory) {return super.getValue();}
}

http://www.lryc.cn/news/411970.html

相关文章:

  • Jangow-1.0.1靶机漏洞复现(未完成)
  • 软件测试--python基础
  • GPIO子系统
  • 学会这个Python库,接口测试so easy
  • Stable Diffusion4.8.7(Ai绘画)软件安装教程
  • 操作系统错误处理
  • 【靶场实操】sql-labs通关详解----第一节:基础注入方式(Less-1~Less-10)
  • 力扣676.实现一个魔法字典
  • ctfshow-web入门-sql注入(web171-web175)
  • 视频怎么添加音乐?分享5种视频添加音乐方法
  • 黑马JavaWeb后端案例开发(包含所有知识点!!!)
  • FPGA开发——蜂鸣器实现音乐播放器的设计
  • InnoDB存储引擎(1)
  • VMWare虚拟机共享主机的网络访问外网
  • LeetCode Easy|【415. 字符串相加】
  • RAG 革命:NVIDIA 工作站如何成为企业 AI 的秘密武器
  • 九大原则,轻松构建个人高效SOP
  • Airtest的demo实现多设备并行
  • 社区养老服务小程序的设计
  • Interceptor拦截器开发
  • 美团 AIGC产品经理面经(已拿 offer)
  • @RequestBody与@RequestParam
  • vmware上,虚机经常丢失网卡。导致无法上网。
  • git 鉴权失败
  • [C++] 容器适配器:深入理解Stack与Queue的底层原理
  • Eclipse maven 的坑
  • 多模态视觉大语言模型——LLaVA
  • 服务注册到nacos上,不能点击下线的问题处理
  • 未来3-5年,哪些工作会被AI取代
  • 鸿蒙系统开发【网络管理】