Solidity极简入门|第十三讲:继承 父与子

文章详细介绍了Solidity中的继承机制,包括简单继承、多重继承以及修饰器和构造函数的继承。通过示例展示了如何使用virtual和override关键字重写父合约的函数,同时也讨论了如何处理重名函数和构造函数的继承。此外,还提到了调用父合约函数的两种方式:直接调用和使用super关键字。
摘要由CSDN通过智能技术生成

继承

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

规则

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

override:子合约重写了父合约中的函数,需要加上 override 关键。

简单继承

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

b3263d082a28df0360ffc65f2a774537.jpeg

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

8e4b11d50c4bf0ca87430c79b37b2d80.jpeg

我们部署合约,可以看到 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)。

例子:

4d57a1ce82c778a04b52bd8349bf5f7d.jpeg

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

修饰器的继承

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

构造函数的继承

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

a3bb60c9bf6ad2fa2f1b5532fa98457f.jpeg

1、在继承时声明父构造函数的参数,例如:contract B is A(1) 

2、在子合约的构造函数中声明构造函数的参数,例如: 

216afc0cf5f40c1e60dc9dd185a04667.jpeg

调用父合约的函数

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

- 直接调用:子合约可以直接用父合约名. 函数名 () 的方式来调用父合约函数,例如 Yeye.pop()。 

d5bb5fad2732742d4fc6082cd7406229.jpeg

- super 关键字:子合约可以利用 super. 函数名 () 来调用最近的父合约函数。solidity 继承关系按声明时从右到左的顺序是:contract Erzi is Yeye, Baba,那么 Baba 是最近的父合约,super.pop() 将调用 Baba.pop() 而不是 Yeye.pop():  

5128059701f6ed93ab7b6f63747fa669.jpeg

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值