Solidity
Solidity 中的 virtual 和 override 關鍵字是什麼?
Solidity 0.6.0 引入了關鍵字
virtual
和override
. 他們在做什麼?
從 Solidity 0.6.0 開始,關鍵字
virtual
和override
在 Solidity 中可用於函式覆蓋。這些關鍵字的目的是在覆蓋函式時更加明確。如果標記為 ,則可以通過繼承契約來更改其行為來覆蓋基本功能virtual
。然後,覆蓋函式必須override
在函式頭中使用關鍵字。這些關鍵字只是在覆蓋函式時允許更明確的行為。在 Solidity 0.6.0 版本之前,這些關鍵字不存在,並且函式覆蓋是隱式完成的。這些關鍵字允許開發人員顯式覆蓋函式。此外,它們允許開發人員表明他們對某些功能的意圖,以便其他人更好地理解該功能的目的。
使用這些關鍵字時有幾點需要注意:
- 對於多重繼承,定義相同函式的最衍生的基礎合約必須在
override
關鍵字之後顯式指定。- 具有
private
可見性的函式不能virtual
。- 沒有實現的函式必須
virtual
在介面之外標記。在介面中,所有功能都被自動考慮virtual
。例子
簡單範例(來自 Solidity 文件)
pragma solidity >=0.5.0 <0.7.0; contract Base { function foo() virtual public {} } contract Middle is Base {} contract Inherited is Middle { function foo() public override {} }
多重繼承範例(來自 Solidity 文件)
pragma solidity >=0.5.0 <0.7.0; contract Base1 { function foo() virtual public {} } contract Base2 { function foo() virtual public {} } contract Inherited is Base1, Base2 { // Derives from multiple bases defining foo(), so we must explicitly // override it function foo() public override(Base1, Base2) {} }