当前位置:网站首页>第97篇 笔记-solidity中的抽象(Abstract)
第97篇 笔记-solidity中的抽象(Abstract)
2022-07-21 10:37:00 【wonderBlock】
目录
1. 抽象合约
如果未实现合约中的至少一个函数,则需要将合约标记为 abstract。
即使实现了所有功能,合同也可能被标记为 abstract。
抽象合约不能通过 new
操作符创建,并且不能在编译期生成字节码(bytecode)。
示例:
//SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;
abstract contract Feline {
function utterance() public returns (bytes32); // 定义了函数,但是没有实现(由 ; 结尾)
}
这样的抽象合约不能直接实例化。
2. 用法
抽象合约作为基类的用法:
//SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;
abstract contract Feline {
function utterance() public pure returns (bytes32);
}
contract Cat is Feline {
function utterance() public pure returns (bytes32) {
return "miaow";
}
}
如果合约继承自抽象合约,并且没有通过重写来实现所有未实现的函数, 它依然需要标记为抽象 abstract 合约。
注意:没有实现的函数与 function type 不同,即使它们的语法看起来非常相似。
// 没有实现的函数示例(函数声明)
function foo(address) external returns (address);
// 函数类型的示例(变量声明,其中变量的类型为“函数”)
function(address) external returns (address) foo;
抽象合约将合约的定义与其实现脱钩,从而提供了更好的可扩展性和自文档性,并消除了代码重复。
抽象合约的使用方式与接口 interface 中定义方法的使用方式相同。
抽象合约的设计者可以这样说:“我的任何继承都必须实施此方法”。
注解:抽象合约不能用一个无实现的函数重写一个实现了的虚函数。
3. 接口
接口类似于抽象合约,但是它们不能实现任何函数。
还有进一步的限制:
- 无法继承其他合约,不过可以继承其他接口。
- 所有的函数都需要是 external。
- 无法定义构造函数。
- 无法定义状态变量。
接口基本上仅限于合约 ABI 可以表示的内容,并且 ABI 和接口之间的转换应该不会丢失任何信息。
接口由它们自己的关键字表示:
//SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.9.0;
interface Token {
enum TokenType { Fungible, NonFungible }
struct Coin { string obverse; string reverse; }
function transfer(address recipient, uint amount) external;
}
就像继承其他合约一样,合约可以继承接口。
接口中的函数都会隐式的标记为 virtual
,意味着他们会被重写。
但是不表示重写(overriding)函数可以再次重写,仅仅当重写的函数标记为 virtual
才可以再次重写。
4. 接口的继承
接口可以继承其他的接口,遵循同样继承规则:
//SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.9.0;
interface ParentA {
function test() external returns (uint256);
}
interface ParentB {
function test() external returns (uint256);
}
interface SubInterface is ParentA, ParentB {
// 必须重新定义 test 函数,以表示兼容父合约含义
function test() external override(ParentA, ParentB) returns (uint256);
}
定义在接口或其他类合约( contract-like)结构体里的类型,可以在其他的合约里用这样的方式访问: Token.TokenType
或 Token.Coin
。
5. 通过接口实现合约间调用
参考 第92篇 合约间调用(一);
边栏推荐
- 图卷机神经网络-GCNN
- Recursion_ Calculate f (n) =f (n-1) +f (n-2)
- Simple shader practice record 5-Screen gradient
- 游戏中的数学之角与弧度、三角函数
- 游戏中的数学之各种插值
- Vscode practical annotation regular substitution
- Filebeat auto close solution
- ThreadPoolTaskExecutor使用
- Simple shader practice record 4-streamer effect
- Master the pose of hook in typescript in 3 minutes
猜你喜欢
随机推荐
likeshop单商户SAAS商城系统无限多开
Custom annotation verification parameters
Day 6(数组例题)
How to make the demand unable to go online smoothly as scheduled (V) business acceptance stage
防止静态反编译及动态反调试,反外挂
Virbox 编译器,支持全平台全架构的源代码加密
3D basis of mathematics in games
【JS 逆向百例】某公共资源交易网,公告 URL 参数逆向分析
机器学习_SoftMax函数(多分类问题)
第108篇 Compound 简单部署
RNN之LSTM和GRU_Attention机制
简易特效制作ByUnityParticleSystem
极化SAR——极化椭圆
Go之数组/切片
restTemplate返回字符乱码问题
阅读笔记:《You Only Look Once:Unified,Real-time Object Detection》
The list set is de duplicated according to the object attributes
CMake系列教程1-初始CMake
LeetCode每日一解
Learning foundation - word memory