Solidity

Solidity 中的 virtual 和 override 關鍵字是什麼?

  • January 13, 2021

Solidity 0.6.0 引入了關鍵字virtualoverride. 他們在做什麼?

從 Solidity 0.6.0 開始,關鍵字virtualoverride在 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) {}
}

引用自:https://ethereum.stackexchange.com/questions/78572