界面契约和抽象契约在实体性上的区别



我正在学习solidity,并了解到interfaceabstract都是可能包含未使用函数的类。我的疑问是:在solidity智能合约中,interfaceabstract 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之后,接口可以从接口继承(,但其他契约可以从接口中继承
  • 接口不能定义构造函数
  • 接口的函数只能是外部类型
  • 接口不能有状态变量
  • 到目前为止,接口无法定义结构和枚举,但可能很快就会更改

相关内容

  • 没有找到相关文章

最新更新