我正在学习solidity,并了解到interface
和abstract
都是可能包含未使用函数的类。我的疑问是:在solidity智能合约中,interface
和abstract contract
之间有什么区别?
它与大多数其他面向对象编程语言相同:
- 接口只声明函数。无法实现它们
- 抽象类可以声明函数(和接口一样(,也可以实现它们
- 两者都不能实例化,需要从中实现/继承
示例:
interface IMyContract {
// can declare, cannot implement
function foo() external returns (bool);
}
abstract contract MyContract {
// can declare
function foo() virtual external returns (bool);
// can implement
function hello() external pure returns (uint8) {
return 1;
}
}
在构建更大、更复杂的分布式应用程序时,扩展性是关键。Solidity提供了两种方法来促进这一点:
抽象合同
如果合同的至少一个功能缺乏实现,则合同被确定为抽象合同。这是对抽象类的唯一要求。因此,它们无法编译。但是,它们可以用作基础合约,其他合约可以从中继承。
-
与其他语言不同,Solidity合约不需要
abstract
关键字标记为抽象。相反,任何至少有一个未实现函数的合同在Solidity中都被视为抽象的。抽象合约既不能编译也不能部署,除非它有一个实现合约contract MyAbstractContract { function myAbstractFunction() public pure returns (string); }
-
如果一个合约继承了一个抽象合约,并且没有实现所有未实现的功能,那么该合约也将被认为是抽象的
//MyContract is also abstract contract MyContract is MyAbstractContract { function myAbstractFunction() public pure returns (string) }
但这不是抽象的,因为我们正在实现函数。
contract MyContract is MyAbstractContract {
function myAbstractFunction() public pure returns (string)
{ return "string value to return"; }
}
abstract contract
既可以具有已实现的函数,也可以具有未实现的函数
接口
接口只能有未实现的函数。此外,它们既没有编译也没有部署。它们也被称为pure abstract contracts
。
- 接口无法实现其任何功能。所有接口函数都是隐式虚拟的
- 接口是用关键字
Interface
定义的 - 接口不能继承其他契约或接口(在solidity 6.0.0之后,接口可以从接口继承(,但其他契约可以从接口中继承
- 接口不能定义构造函数
- 接口的函数只能是外部类型
- 接口不能有状态变量
- 到目前为止,接口无法定义结构和枚举,但可能很快就会更改