写点什么

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

作者:BSN研习社
  • 2023-12-14
    北京
  • 本文字数:1497 字

    阅读完需:约 5 分钟

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

抽象合约(abstractcontract)

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

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

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

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

// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.0;
//base contractabstract contract Animal { function eat() virtual public ;}
contract Bird is Animal { function eat() override public {
}}
复制代码


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

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

// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.0;
//base contractcontract 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.0pragma solidity ^0.8.0;
//base contractcontract 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.0pragma solidity ^0.8.0;
//base contractcontract 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 之旅十)》

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

用户头像

BSN研习社

关注

还未添加个人签名 2021-11-05 加入

还未添加个人简介

评论

发布
暂无评论
Solidity之旅(十)OOP-抽象合约_BSN研习社_InfoQ写作社区