抽象合約

2022-05-16 10:48 更新

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

使用abstract關(guān)鍵字聲明抽象合約,如以下示例所示。請(qǐng)注意,該合約需要定義為抽象的,因?yàn)閡tterance()聲明了函數(shù),但沒有提供實(shí)現(xiàn)(沒有給出實(shí)現(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);
}

這樣的抽象合約不能直接實(shí)例化。如果抽象合約本身確實(shí)實(shí)現(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"; }
}

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

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

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

function foo(address) external returns (address);

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

function(address) external returns (address) foo;

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

筆記

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)