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

濮阳市网站建设域名地址查询

濮阳市网站建设,域名地址查询,百度上网站怎么做,建设网站的服务宗旨Solidity 小白教程:13. 继承 这一讲,我们介绍solidity中的继承(inheritance),包括简单继承,多重继承,以及修饰器(modifier)和构造函数(constructor&#xff…

Solidity 小白教程:13. 继承

这一讲,我们介绍solidity中的继承(inheritance),包括简单继承,多重继承,以及修饰器(modifier)和构造函数(constructor)的继承。

继承

继承是面向对象编程很重要的组成部分,可以显著减少重复代码。如果把合约看作是对象的话,solidity也是面向对象的编程,也支持继承。

规则

  • virtual: 父合约中的函数,如果希望子合约重写,需要加上virtual关键字。
  • override:子合约重写了父合约中的函数,需要加上override关键字。

注意:用override修饰public变量,会重写与变量同名的getter函数,例如:

mapping(address => uint256) public override balanceOf;

简单继承

我们先写一个简单的爷爷合约Yeye,里面包含 1 个Log事件和 3 个function: hip(), pop(), yeye(),输出都是”Yeye”。

contract Yeye {event Log(string msg);// 定义3个function: hip(), pop(), man(),Log值为Yeye。function hip() public virtual{emit Log("Yeye");}function pop() public virtual{emit Log("Yeye");}function yeye() public virtual {emit Log("Yeye");}
}

我们再定义一个爸爸合约Baba,让他继承Yeye合约,语法就是contract Baba is Yeye,非常直观。在Baba合约里,我们重写一下hip()pop()这两个函数,加上override关键字,并将他们的输出改为**”Baba”;并且加一个新的函数baba**,输出也是**”Baba”**。

contract Baba is Yeye{// 继承两个function: hip()和pop(),输出改为Baba。function hip() public virtual override{emit Log("Baba");}function pop() public virtual override{emit Log("Baba");}function baba() public virtual{emit Log("Baba");}
}

我们部署合约,可以看到Baba合约里有 4 个函数,其中hip()pop()的输出被成功改写成”Baba”,而继承来的yeye()的输出仍然是”Yeye”

多重继承

solidity的合约可以继承多个合约。规则:

  1. 继承时要按辈分最高到最低的顺序排。比如我们写一个Erzi合约,继承Yeye合约和Baba合约,那么就要写成contract Erzi is Yeye, Baba,而不能写成contract Erzi is Baba, Yeye,不然就会报错。
  2. 如果某一个函数在多个继承的合约里都存在,比如例子中的hip()pop(),在子合约里必须重写,不然会报错。
  3. 重写在多个父合约中都重名的函数时,override关键字后面要加上所有父合约名字,例如override(Yeye, Baba)

例子:

contract Erzi is Yeye, Baba{// 继承两个function: hip()和pop(),输出值为Erzi。function hip() public virtual override(Yeye, Baba){emit Log("Erzi");}function pop() public virtual override(Yeye, Baba) {emit Log("Erzi");}

我们可以看到,Erzi合约里面重写了hip()pop()两个函数,将输出改为”Erzi”,并且还分别从YeyeBaba合约继承了**yeye()baba()**两个函数。

修饰器的继承

Solidity中的修饰器(Modifier)同样可以继承,用法与函数继承类似,在相应的地方加virtualoverride关键字即可。

contract Base1 {modifier exactDividedBy2And3(uint _a) virtual {require(_a % 2 == 0 && _a % 3 == 0);_;}
}contract Identifier is Base1 {//计算一个数分别被2除和被3除的值,但是传入的参数必须是2和3的倍数function getExactDividedBy2And3(uint _dividend) public exactDividedBy2And3(_dividend) pure returns(uint, uint) {return getExactDividedBy2And3WithoutModifier(_dividend);}//计算一个数分别被2除和被3除的值function getExactDividedBy2And3WithoutModifier(uint _dividend) public pure returns(uint, uint){uint div2 = _dividend / 2;uint div3 = _dividend / 3;return (div2, div3);}
}

Identifier合约可以直接在代码中使用父合约中的exactDividedBy2And3修饰器,也可以利用override关键字重写修饰器:

modifier exactDividedBy2And3(uint _a) override {_;require(_a % 2 == 0 && _a % 3 == 0);}

构造函数的继承

子合约有两种方法继承父合约的构造函数。举个简单的例子,父合约A里面有一个状态变量a,并由构造函数的参数来确定:

// 构造函数的继承
abstract contract A {uint public a;constructor(uint _a) {a = _a;}
}
  1. 在继承时声明父构造函数的参数,例如:contract B is A(1)
  2. 在子合约的构造函数中声明构造函数的参数,例如:
contract C is A {constructor(uint _c) A(_c * _c) {}
}

调用父合约的函数

子合约有两种方式调用父合约的函数,直接调用和利用super关键字。

  1. 直接调用:子合约可以直接用父合约名.函数名()的方式来调用父合约函数,例如Yeye.pop()
function callParent() public{Yeye.pop();}
  1. super关键字:子合约可以利用super.函数名()来调用最近的父合约函数。solidity继承关系按声明时从右到左的顺序是:contract Erzi is Yeye, Baba,那么Baba是最近的父合约,super.pop()将调用Baba.pop()而不是Yeye.pop()
function callParentSuper() public{// 将调用最近的父合约函数,Baba.pop()super.pop();}

钻石继承

在面向对象编程中,钻石继承(菱形继承)指一个派生类同时有两个或两个以上的基类。
在多重+菱形继承链条上使用super关键字时,需要注意的是使用super会调用继承链条上的每一个合约的相关函数,而不是只调用最近的父合约。
我们先写一个合约God,再写AdamEve两个合约继承God合约,最后让创建合约people继承自AdamEve,每个合约都有foobar两个函数。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;/* 继承树:God/  \
Adam Eve\  /
people
*/contract God {event Log(string message);function foo() public virtual {emit Log("God.foo called");}function bar() public virtual {emit Log("God.bar called");}
}contract Adam is God {function foo() public virtual override {emit Log("Adam.foo called");}function bar() public virtual override {emit Log("Adam.bar called");super.bar();}
}contract Eve is God {function foo() public virtual override {emit Log("Eve.foo called");Eve.foo();}function bar() public virtual override {emit Log("Eve.bar called");super.bar();}
}contract people is Adam, Eve {function foo() public override(Adam, Eve) {super.foo();}function bar() public override(Adam, Eve) {super.bar();}
}

在这个例子中,调用合约people中的super.bar()会依次调用EveAdam,最后是God合约。
虽然EveAdam都是God的子合约,但整个过程中God合约只会被调用一次。原因是 Solidity 借鉴了 Python 的方式,强制一个由基类构成的 DAG(有向无环图)使其保证一个特定的顺序。更多细节你可以查阅Solidity 的官方文档。

在 Remix 上验证

  • 合约简单继承示例, 可以观察到 Baba 合约多了 Yeye 的函数image.pngimage.png
  • 合约多重继承可以参考简单继承的操作步骤来增加部署 Erzi 合约,然后观察暴露的函数以及尝试调用来查看日志
  • 修饰器继承示例image.pngimage.pngimage.png
  • 构造函数继承示例image.pngimage.png
  • 调用父合约示例image.pngimage.png
  • 菱形继承示例image.png

总结

这一讲,我们介绍了solidity继承的基本用法,包括简单继承,多重继承,修饰器和构造函数的继承、调用父合约中的函数,以及多重继承中的菱形继承问题。

http://www.wangmingla.cn/news/100452.html

相关文章:

  • 湛江海田网站建设招聘竞价推广哪里开户
  • 网站建设可以网上兼职吗北京网站优化效果
  • 如何在网站上做淘宝客推广东莞网站建设推广公司
  • 物流公司网站制作模板权重查询站长工具
  • 凡科代理平台seo关键词优化排名哪家好
  • 网站源码文件优搜云seo
  • 住房和城乡建设部网站北京国内最好的seo培训
  • 免费做抽奖的h5网站seo怎么优化方法
  • 信通网站开发中心网站推广优化怎么做最好
  • wordpress 伪静态 效果郑州专业seo哪家好
  • 大连市那里做网站宣传的好网站制作多少钱一个
  • 东莞凤岗网站建设制作广告海外推广
  • 深圳网站建设 site最新seo网站优化教程
  • 高密做网站的价格网络营销和市场营销的区别
  • 怎么看网站是否被k过独立站seo
  • 设计建设网站公司哪家好全球外贸b2b网站
  • 北京市网站备案查询国内销售平台有哪些
  • 用php和mysql做网站3步打造seo推广方案
  • 网站域名备案在阿里云怎么做网站发布与推广怎么写
  • 威海外贸网站建设电话电商网站网址
  • 郴州网招聘找工作百度seo软件优化
  • 网站建设名牌seo 优化是什么
  • 装修平台网站制作网络营销培训班
  • 机房建设网站模板谷歌seo培训
  • wordpress淘宝联盟模板下载地址网站seo优化课程
  • 做网站和做微信小程序友情链接是什么意思
  • 百度搜索网站怎么做seo客服
  • 佛山网络公司哪个好厦门seo推广公司
  • 常见的电子商务网站推广方式网络平台怎么推广
  • wordpress 禁用头像保定seo排名优化