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

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

更新於 發佈於 閱讀時間約 5 分鐘

圖片來源

我們在「【開發智能合約 — 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的文章請看這裡…

avatar-img
阿Han的沙龍
127會員
281內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言
avatar-img
留言分享你的想法!
阿Han的沙龍 的其他內容
 相信常常聽到元宇宙的世界裡有一個並不陌生又有點距離的名詞「XR擴展實境」,包含了三大核心技術,分別為VR、AR與MR,其中VR與AR較為貼近我們的生活,那三者究竟有何不同呢? 就讓我們持續的看下去吧! VR 虛轉實,把假的變成真的 說到VR最直覺的就是想到VR頭盔吧,它可以帶給我
什麼是零知識證明(Zero-knowledge proof) 是一種密碼學的概念,用於在不揭示具體信息的情況下,證明某個主張的正確性。它允許一方(稱為證明者)向另一方(稱為驗證者)證明某個陳述的真實性,而無需透露任何關於陳述的具體細節..., 這根本文字天書啊,底下讓我們用白話文來說一下唄! 「我必
一套大型的智能合約通常都會拆分成許多小合約,並且透過匯入的方式拼裝而成,而這樣的匯入在Solidity世界中就是「Import」,就讓我們來看看「Import」到底怎麼運用吧! 假設目錄結構如下 example.sol other.sol 我們引入的方式就會是: import ‘./other.so
 相信常常聽到元宇宙的世界裡有一個並不陌生又有點距離的名詞「XR擴展實境」,包含了三大核心技術,分別為VR、AR與MR,其中VR與AR較為貼近我們的生活,那三者究竟有何不同呢? 就讓我們持續的看下去吧! VR 虛轉實,把假的變成真的 說到VR最直覺的就是想到VR頭盔吧,它可以帶給我
什麼是零知識證明(Zero-knowledge proof) 是一種密碼學的概念,用於在不揭示具體信息的情況下,證明某個主張的正確性。它允許一方(稱為證明者)向另一方(稱為驗證者)證明某個陳述的真實性,而無需透露任何關於陳述的具體細節..., 這根本文字天書啊,底下讓我們用白話文來說一下唄! 「我必
一套大型的智能合約通常都會拆分成許多小合約,並且透過匯入的方式拼裝而成,而這樣的匯入在Solidity世界中就是「Import」,就讓我們來看看「Import」到底怎麼運用吧! 假設目錄結構如下 example.sol other.sol 我們引入的方式就會是: import ‘./other.so