W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
當(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ù)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: