2

我正在学习solidity并了解这一点interface,并且abstract这两个类都可能包含未使用的功能。我的疑问是: solidity 智能合约interface之间有什么区别?abstract contract

4

2 回答 2

1

抽象类

如果合约的至少一项功能缺少实现,则合约被识别为抽象合约。这是抽象类的唯一要求。因此,它们无法编译。但是,它们可以用作其他合约可以继承的基础合约。

  • 与其他语言不同,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"; }
    }
  • Anabstract contract可以同时具有已实现和未实现的功能。

接口

接口只能有未实现的功能。此外,它们既不编译也不部署。

  • 接口不能实现它们的任何功能。所有接口函数都是隐式虚拟的
  • 接口是用关键字定义的Interface
  • 接口不能继承其他合约或接口,但其他合约可以从接口继承。
  • 接口不能定义构造函数
  • 接口不能有状态变量
  • 截至目前,接口无法定义结构和枚举,但可能很快就会改变。
于 2022-02-06T14:42:44.183 回答
1

它与大多数其他面向对象的编程语言相同:

  • 接口只声明函数。无法实现它们。
  • 抽象类可以声明函数(与接口相同)以及实现它们。
  • 两者都无法实例化,需要实现/继承。

例子:

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;
    }
}
于 2022-02-06T10:04:33.377 回答