Solidity 多重继承 C3算法

这篇具有很好参考价值的文章主要介绍了Solidity 多重继承 C3算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 

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

contract A {
    event Log(string message);

    function bar() public virtual {
        emit Log("A.bar called");
    }
}

contract B is A {

    function bar() public virtual override {
        emit Log("B.bar called");
        super.bar();
    }
}

contract C is A {

    function bar() public virtual override {
        emit Log("C.bar called");
        super.bar();
    }
}

contract D is B, C {

    function bar() public override(B, C) {
        super.bar();
    }
}

执行D.bar的结果

[
	{
		"from": "0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8",
		"topic": "0xcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab",
		"event": "Log",
		"args": {
			"0": "C.bar called",
			"message": "C.bar called"
		}
	},
	{
		"from": "0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8",
		"topic": "0xcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab",
		"event": "Log",
		"args": {
			"0": "B.bar called",
			"message": "B.bar called"
		}
	},
	{
		"from": "0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8",
		"topic": "0xcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab",
		"event": "Log",
		"args": {
			"0": "A.bar called",
			"message": "A.bar called"
		}
	}
]

执行顺序

  • 最右C.bar
  • C里有 super.bar,执行的是b里的 bar
  • B里的 super.bar 执行的是a里的bar

具体原因是:

Solidity Diamond Inheritance - Guides and Tutorials - OpenZeppelin Forum

solidity和python一样采用C3 继承算法

去掉代码里的 super.bar,结果就变成文章来源地址https://www.toymoban.com/news/detail-518757.html

[
	{
		"from": "0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005",
		"topic": "0xcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab",
		"event": "Log",
		"args": {
			"0": "C.bar called",
			"message": "C.bar called"
		}
	}
]

到了这里,关于Solidity 多重继承 C3算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中一个类可以继承多个类吗?揭秘多重继承的秘密!

    大家好,我是你们的小米!今天,我们来聊聊Java中一个备受争议的话题——\\\"一个类可以继承多个类吗?\\\"这是一个让许多Java初学者困惑的问题,也是一个常常被问及的热门话题。那么,到底Java中是否允许一个类继承多个类呢?让我们一起揭开这个谜底吧! 在开始之前,我们

    2024年02月02日
    浏览(29)
  • C++ 多级继承与多重继承:代码组织与灵活性的平衡

    多级继承是一种面向对象编程(OOP)特性,允许一个类从多个基类继承属性和方法。它使代码更易于组织和维护,并促进代码重用。 在 C++ 中,使用 : 符号来指定继承关系。多级继承的语法如下: 在这个例子中, DerivedClass 从 BaseClass1 和 BaseClass2 继承。这意味着它将继承这两

    2024年04月25日
    浏览(24)
  • Solidity 小白教程:13. 继承

    这一讲,我们介绍 solidity 中的继承( inheritance ),包括简单继承,多重继承,以及修饰器( modifier )和构造函数( constructor )的继承。 继承是面向对象编程很重要的组成部分,可以显著减少重复代码。如果把合约看作是对象的话, solidity 也是面向对象的编程,也支持继承

    2024年02月09日
    浏览(19)
  • Solidity极简入门#13. 继承

    这一讲,我们介绍solidity中的继承(inheritance),包括简单继承,多重继承,以及修饰器(modifier)和构造函数(constructor)的继承。 继承是面向对象编程很重要的组成部分,可以显著减少重复代码。如果把合约看作是对象的话,solidity也是面向对象的编程,也支持继承。 规则

    2024年02月13日
    浏览(21)
  • solidity第九课——事件与继承

    来到基础课程中的难点与重点课,事件与继承。 一,事件 事件是合约区块链通讯的一种机制。应用“监听”某些事件,并作出反应。solidity中的事件具有两个特点: 1.响应,应用程序(ether.js)可以通过RPC接口订阅和监听这些事件,并在前端做出反应。 2.经济,事件是EVM上比较

    2024年02月16日
    浏览(30)
  • 【区块链 | Solidity】跟我学 Solidity(7):事件

    如何使用事件记录数据 原文: https://medium.com/better-programming/learn-solidity-events-2801d6a99a92 作者: wissal haji 欢迎订阅《Solidity智能合约零基础开发教程专栏》系列文章。 在今天的文章中,我们将看到如何使用web3.js从区块链中读取事件。 Solidity中的事件就像你习惯于使用其他语

    2024年01月25日
    浏览(43)
  • 区块链2——Solidity智能合约开发

    区块链 索引目录 智能合约是一种以代码形式编写的自动执行合约,它们运行在区块链上。这些合约定义了在特定条件下发生的事件以及相应的行为。 1.1 智能合约结构 版本声明(Version Declaration): 智能合约通常以声明版本开始,指定合约应该使用的Solidity编译器版本。例如

    2024年02月05日
    浏览(54)
  • 区块链智能合约编程语言 Solidity

    上文介绍了区块链生态发展,我们知道以太坊的到来可以使开发人员基于区块链开发DApp,本文介绍 Solidity 编程语言的使用,然后基于 Solidity 编写一个简单的智能合约。 Solidity 是以太坊开发人员使用的编程语言,用来编写智能合约,运行在以太坊虚拟机(EVM)上。 有开发经

    2024年02月12日
    浏览(45)
  • 【区块链Solidity】开发环境的注册与认证

     往期文章 【区块链Solidity】智能合约与Solidity介绍 目录 工具介绍  百度超级链 目前开发智能合约的IDE,首推还是Remix,而Remix官网,总是由于各种各样的(网络原因)无法使用,我们可以在本地搭建智能合约开发环境remix-ide,除此之外我们还可以使用国内的百度超级链进行

    2024年02月08日
    浏览(26)
  • 区块链入门系列文章—solidity中的HelloWord

    本系列教程将从零开始记入笔者学习区块链的过程,欢迎批评指正。 Solidity 的代码都涵盖在智能合约里面. 一个智能合约就是以太坊应用的最小单元, 所有的变量和函数都属于一个智能合约, 它是你所有应用的起点。 代码如下(示例): pragma solidity ^0.4.19; 0.4.19代表的是你使

    2024年02月02日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包