【開發智能合約 — Solidity系列】實作篇Ep.11 — 繼承同源但不同意圖的函數覆寫(Function Overriding)

Han
阿Han的圖文解字筆記
Oct 29, 2022
圖片來源

我們在「【開發智能合約 — Solidity系列】實作篇Ep.9 — 何謂繼承(Inheritance)」有提到繼承的一些基本概念,然而在繼承的過程中我們可能會用到上游的方法,甚至加工,而方法名稱重複了,是否能被允許呢? 答案是「允許」的,就好比我們雖然繼承了父親的「處事技巧」,但在求新求變的時代中,或許傳統的老舊方法已經不適用於現代,因此就需要覆寫掉「處事技巧」這個方法,甚至基於傳統的方法之後進行擴增,而Solidity提供了繼承當然也支援了覆寫的方式,讓整個合約更加彈性。

但有幾個值得注意的是,當我們的合約欲設計為可覆寫的方法時,需要加入兩個重要的關鍵字,分別為:

  • virtual: 被繼承的合約方法需要標示此關鍵字之後,該方法才能被覆寫。
  • override: 標示該方法以覆寫後的形式呈現。
contract Parent {
/// @notice 工作
/// @dev 欲被繼承的方法應使用virtual關鍵字宣告
function doJob() public pure virtual {
...
}
}
contract Child is Parent {
/// @notice 工作
/// @dev 繼承並覆寫應使用override關鍵字宣告
function doJob() public pure override {
...
}
}

另外我們也可以用「擴充」的觀點來進行覆寫的功能加強。

contract Parent {
event Log(string msg);
/// @notice 工作
/// @dev 欲被繼承的方法應使用virtual關鍵字宣告
function doJob() public virtual {
emit Log("i am parent");
}
}
contract Child is Parent { /// @notice 工作
/// @dev 繼承並覆寫應使用override關鍵字宣告
function doJob() public override {
/// @dev 呼叫上游的方法
super.doJob();
/// @dev 再進行擴充
emit Log("i am child");
}
}

實際Demo範例

我們一樣使用Solidity Remix Editor來進行合約的測試,如果不清楚如何進行Debug的朋友歡迎先來閱讀此篇「【開發智能合約 — Solidity系列】環境與工具篇:如何使用Remix進行Debug」,接著我們就直接進行Deploy到暫存鏈進行測試如下:

圖片來源

結語

玩到這邊,漸漸的發現其實Solidity融合了物件導向的概念,不僅具有物件、介面、繼承…,更是能夠進行override,對於物件導向基礎已經打的非常穩固的朋友來說應該相當的容易入門,而我們學習物件導向的過程中應該常常被「overriding」與「overloading」搞混對吧! 這兩個名詞的理解其實是有訣竅的哦! 我們下一篇「【開發智能合約 — Solidity系列】實作篇Ep.12 — 合約內同名但不同用途的函數超載(Function Overloading)」就會帶大家如何識別這兩個相似名詞的差異。

今天的範例都在這裡「📦 solidity-remix-toturial/Ep11」歡迎自行取用。

下一篇的傳送門:

⏭️【開發智能合約 — Solidity系列】實作篇Ep.12 — 合約內同名但不同用途的函數超載(Function Overloading)

📚 更多關於Solidity的文章請看這裡…

喜歡撰寫文章的你,不妨來了解一下:

Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入?

歡迎加入一起練習寫作,賺取知識,累積財富!

--

--