抽象合約

2022-05-16 10:48 更新

當至少其中一個功能未實現(xiàn)或未為其所有基本合約構(gòu)造函數(shù)提供參數(shù)時,必須將合約標記為抽象。即使不是這種情況,合同仍可能被標記為抽象,例如當您不打算直接創(chuàng)建合同時。抽象契約類似于接口,但接口在它可以聲明的內(nèi)容方面受到更多限制。

使用abstract關(guān)鍵字聲明抽象合約,如以下示例所示。請注意,該合約需要定義為抽象的,因為utterance()聲明了函數(shù),但沒有提供實現(xiàn)(沒有給出實現(xiàn)主體)。{ }

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.0 <0.9.0;

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

這樣的抽象合約不能直接實例化。如果抽象合約本身確實實現(xiàn)了所有定義的功能,這也是正確的。抽象合約作為基類的用法如下例所示:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.0 <0.9.0;

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

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

如果合約繼承自抽象合約,并且沒有通過覆蓋實現(xiàn)所有未實現(xiàn)的功能,則也需要將其標記為抽象。

請注意,沒有實現(xiàn)的函數(shù)與函數(shù)類型不同,盡管它們的語法看起來非常相似。

沒有實現(xiàn)的函數(shù)示??例(函數(shù)聲明):

function foo(address) external returns (address);

類型為函數(shù)類型的變量的聲明示例:

function(address) external returns (address) foo;

抽象契約將契約的定義與其實現(xiàn)分離,提供更好的可擴展性和自文檔化,并促進模板方法等模式和消除代碼重復。抽象契約的用處與在接口中定義方法的用處相同。這是抽象合約的設計者說“我的任何孩子都必須實現(xiàn)這個方法”的一種方式。

筆記

抽象合約不能用未實現(xiàn)的虛函數(shù)覆蓋已實現(xiàn)的虛函數(shù)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號