2023-05-16|閱讀時間 ‧ 約 5 分鐘

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

我們在「【開發智能合約 — 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」歡迎自行取用。
下一篇的傳送門:
分享至
成為作者繼續創作的動力吧!
主軸圍繞於軟體科技, 除了過往經驗成章以外也持續學習新技能, 並將學習心法記錄與分享, 以期幫助相同道路之夥伴。 裡面包含著各種程式語言的疑難雜症解題技巧, 也提供資料庫、AI、認證與授權、工具庫...等技巧, 讓您自由找出您想要的解答, 如果您想要系統化的教學課程也歡迎至「🔒 阿Han的軟體心法實戰營」。
© 2024 vocus All rights reserved.