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

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

我們在「【開發智能合約 — 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到暫存鏈進行測試如下:

raw-image

結語

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

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

下一篇的傳送門:

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

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

留言
avatar-img
留言分享你的想法!
avatar-img
阿Han的沙龍
131會員
295內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
阿Han的沙龍的其他內容
2023/08/01
 相信常常聽到元宇宙的世界裡有一個並不陌生又有點距離的名詞「XR擴展實境」,包含了三大核心技術,分別為VR、AR與MR,其中VR與AR較為貼近我們的生活,那三者究竟有何不同呢? 就讓我們持續的看下去吧! VR 虛轉實,把假的變成真的 說到VR最直覺的就是想到VR頭盔吧,它可以帶給我
Thumbnail
2023/08/01
 相信常常聽到元宇宙的世界裡有一個並不陌生又有點距離的名詞「XR擴展實境」,包含了三大核心技術,分別為VR、AR與MR,其中VR與AR較為貼近我們的生活,那三者究竟有何不同呢? 就讓我們持續的看下去吧! VR 虛轉實,把假的變成真的 說到VR最直覺的就是想到VR頭盔吧,它可以帶給我
Thumbnail
2023/06/30
什麼是零知識證明(Zero-knowledge proof) 是一種密碼學的概念,用於在不揭示具體信息的情況下,證明某個主張的正確性。它允許一方(稱為證明者)向另一方(稱為驗證者)證明某個陳述的真實性,而無需透露任何關於陳述的具體細節..., 這根本文字天書啊,底下讓我們用白話文來說一下唄! 「我必
Thumbnail
2023/06/30
什麼是零知識證明(Zero-knowledge proof) 是一種密碼學的概念,用於在不揭示具體信息的情況下,證明某個主張的正確性。它允許一方(稱為證明者)向另一方(稱為驗證者)證明某個陳述的真實性,而無需透露任何關於陳述的具體細節..., 這根本文字天書啊,底下讓我們用白話文來說一下唄! 「我必
Thumbnail
2023/05/31
一套大型的智能合約通常都會拆分成許多小合約,並且透過匯入的方式拼裝而成,而這樣的匯入在Solidity世界中就是「Import」,就讓我們來看看「Import」到底怎麼運用吧! 假設目錄結構如下 example.sol other.sol 我們引入的方式就會是: import ‘./other.so
Thumbnail
2023/05/31
一套大型的智能合約通常都會拆分成許多小合約,並且透過匯入的方式拼裝而成,而這樣的匯入在Solidity世界中就是「Import」,就讓我們來看看「Import」到底怎麼運用吧! 假設目錄結構如下 example.sol other.sol 我們引入的方式就會是: import ‘./other.so
Thumbnail
看更多
你可能也想看
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
  Soildity是一種風格類似JavaScript的強型別高階語言,專門用來進行智能合約的開發及編程。本文敘述solidity的獨特之處。   
Thumbnail
  Soildity是一種風格類似JavaScript的強型別高階語言,專門用來進行智能合約的開發及編程。本文敘述solidity的獨特之處。   
Thumbnail
一套大型的智能合約通常都會拆分成許多小合約,並且透過匯入的方式拼裝而成,而這樣的匯入在Solidity世界中就是「Import」,就讓我們來看看「Import」到底怎麼運用吧! 假設目錄結構如下 example.sol other.sol 我們引入的方式就會是: import ‘./other.so
Thumbnail
一套大型的智能合約通常都會拆分成許多小合約,並且透過匯入的方式拼裝而成,而這樣的匯入在Solidity世界中就是「Import」,就讓我們來看看「Import」到底怎麼運用吧! 假設目錄結構如下 example.sol other.sol 我們引入的方式就會是: import ‘./other.so
Thumbnail
簡單的來說就是把同類型常用的功能打包在一起,讓其他開發者能夠重複使用,達到資源有效利用的效果,以軟體開發來說就是減少多餘的程式碼,而Solidity語言中,Library可以視為物件導向中的靜態類別,不需要產生實體就能使用,因此能有效的減少Gas。 當我們剛完成一份合約時難免因為設計尚未考慮周全而導
Thumbnail
簡單的來說就是把同類型常用的功能打包在一起,讓其他開發者能夠重複使用,達到資源有效利用的效果,以軟體開發來說就是減少多餘的程式碼,而Solidity語言中,Library可以視為物件導向中的靜態類別,不需要產生實體就能使用,因此能有效的減少Gas。 當我們剛完成一份合約時難免因為設計尚未考慮周全而導
Thumbnail
我們在「【開發智能合約 — Solidity系列】實作篇Ep.9 — 何謂繼承(Inheritance)」有提到繼承的一些基本概念,然而在繼承的過程中我們可能會用到上游的方法,甚至加工,而方法名稱重複了,是否能被允許呢? 答案是「允許」的,就好比我們雖然繼承了父親的「處事技巧」,但在求新求變的時代中
Thumbnail
我們在「【開發智能合約 — Solidity系列】實作篇Ep.9 — 何謂繼承(Inheritance)」有提到繼承的一些基本概念,然而在繼承的過程中我們可能會用到上游的方法,甚至加工,而方法名稱重複了,是否能被允許呢? 答案是「允許」的,就好比我們雖然繼承了父親的「處事技巧」,但在求新求變的時代中
Thumbnail
一個功能越趨完善且複雜的合約,勢必會拆成許多合約共同組成,而其實這些組成的合約之中許多的方法、元素都是重複的,因此我們可以使用Inheritance(繼承)的技巧,將共同的屬性、方法抽到某個上級合約,而其餘的合約只要繼承自上級合約,就能減少重複開發的狀況,我們都知道軟體開發的過程,只要開發的原始碼越
Thumbnail
一個功能越趨完善且複雜的合約,勢必會拆成許多合約共同組成,而其實這些組成的合約之中許多的方法、元素都是重複的,因此我們可以使用Inheritance(繼承)的技巧,將共同的屬性、方法抽到某個上級合約,而其餘的合約只要繼承自上級合約,就能減少重複開發的狀況,我們都知道軟體開發的過程,只要開發的原始碼越
Thumbnail
為什麼要特別介紹可視範圍呢? 試想,假如我們的合約裡有些非常重要的內容只能侷限於合約內使用,此時就可以運用可視範圍的技巧,將某些重要的功能、狀態鎖定在合約內使用,不隨意開放給外部調用,避免汙染內部,但有些又是共用的內容及功能時,我們就可以利用公開的可視範圍讓相同的功能能夠重複使用。 合約中又可以依照
Thumbnail
為什麼要特別介紹可視範圍呢? 試想,假如我們的合約裡有些非常重要的內容只能侷限於合約內使用,此時就可以運用可視範圍的技巧,將某些重要的功能、狀態鎖定在合約內使用,不隨意開放給外部調用,避免汙染內部,但有些又是共用的內容及功能時,我們就可以利用公開的可視範圍讓相同的功能能夠重複使用。 合約中又可以依照
Thumbnail
建議閱讀前可以先了解一下「【開發智能合約 — Solidity系列】開發環境準備」,會比較容易操作Remix來開發智能合約。 Remix IDE的Debug方式其實也類似於我們開發軟體程式過程中的Debug流程,編輯好程式碼之後,經過編譯,發佈到暫存鏈上,對每一個區塊進行Debug,過程中逐步排查出
Thumbnail
建議閱讀前可以先了解一下「【開發智能合約 — Solidity系列】開發環境準備」,會比較容易操作Remix來開發智能合約。 Remix IDE的Debug方式其實也類似於我們開發軟體程式過程中的Debug流程,編輯好程式碼之後,經過編譯,發佈到暫存鏈上,對每一個區塊進行Debug,過程中逐步排查出
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News