抽象合约

如果未实现合约中的至少一个函数,则需要将合约标记为 abstract。 即使实现了所有功能,合同也可能被标记为abstract。

如下例所示,使用关键字 abstract 定义抽象合约合约, utterance() 函数了,但没有实现.(由 ; 结尾):

pragma solidity >=0.6.0 <0.7.0;

abstract contract Feline {
    function utterance() public returns (bytes32);
}

这样的抽象合约不能直接实例化。 如果抽象合约本身确实都有实现所有定义的函数,也是正确的。 下例显示了抽象合约作为基类的用法:

pragma solidity ^0.6.0;

abstract contract Feline {
  function utterance() public returns (bytes32);
}

contract Cat is Feline {
  function utterance() public returns (bytes32) { return "miaow"; }
}

如果合约继承自抽象合约,并且没有通过重写来实现所有未实现的函数, 它依然需要标记为抽象 abstract 合约.

请注意,没有实现的函数与 Function Type 不同,即使它们的语法看起来非常相似。

没有实现的函数示例(函数声明):

function foo(address) external returns (address);

函数类型的示例(变量声明,其中变量的类型为“函数”):

function(address) external returns (address) foo;

抽象合约将合约的定义与其实现脱钩,从而提供了更好的可扩展性和自文档性,并简化了诸如 Template方法 的模式并消除了代码重复。抽象合约的使用方式与接口 interface 中定义方法的使用方式相同。 抽象合约的设计者可以这样说“我的任何继承都必须实施此方法”。

注解

抽象合约不能用一个无实现的函数重写一个实现了的虚函数。