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