跳到主要內容

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

 

我們上一篇有介紹了「【開發智能合約 - Solidity系列】實作篇Ep.11 - 繼承同源但不同意圖的函數覆寫(Function Overriding)」學習到overriding這個關鍵字的概念,而今天介紹另一個非常相似的名詞overloading(超載),兩者看似很像,但本質上卻存在著非常大的差異,究竟要如何分辨呢?

Overriding V.S Overloading

首先是overriding的概念,override這個單詞代表著覆蓋的意思,可以理解為「覆蓋掉xxx方法」,但為什麼沒看到在同一份合約中以override形式出現呢? 試想,同一份合約覆蓋相同方法似乎沒什麼意義對吧,有點脫褲子放屁的意義,因為最終僅會保留最後一份最新的功能函數(function),因此overriding才會被應用在繼承的情境之下。

contract Parent {
/// @notice 工作
/// @dev 欲被繼承的方法應使用virtual關鍵字宣告
function doJob() public pure virtual {
...
}
}

contract Child is Parent {
/// @notice 工作
/// @dev 繼承並覆寫應使用override關鍵字宣告
function doJob() public pure override {
...
}
}

再者是overloading的概念,這邊可以拆成over及loading分開來看,over代表著「超過…」的意思,而loading則是「載入更多…」,合再一起看就是「超過…就載入更多…」,因此才會有同一份合約中明明相同的函數名稱,卻允許不同的參數傳入,也實現了不同的實作方法。

contract OverloadingExample {

/// @notice 繪製單點圖
/// @dev 繪製x軸
function draw(uint x) public pure {

}

/// @notice 繪製平面圖
/// @dev 繪製x、y軸的平面圖
function draw(uint x, uint y) public pure {

}

/// @notice 繪製3D圖
/// @dev 繪製x、y、z軸的3D圖
function draw(uint x, uint y, uint z) public pure {

}
}

實際Demo範例

contract OverloadingExample {
event Log(string msg);

/// @notice 繪製單點圖
/// @dev 繪製x軸
function draw(uint x) public {
emit Log("draw x");
}

/// @notice 繪製平面圖
/// @dev 繪製x、y軸的平面圖
function draw(uint x, uint y) public {
emit Log("draw x y");
}

/// @notice 繪製3D圖
/// @dev 繪製x、y、z軸的3D圖
function draw(uint x, uint y, uint z) public {
emit Log("draw x y z");
}
}

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

繪製單點圖

繪製2D平面圖

繪製3D圖

結語

這一次學習到Overriding與Overloading的不同之處,常常我們都被非常相似的名詞搞混,但事實上理解它們是有一套邏輯可以融會貫通的,不一定要死記名詞,而是藉由聯想的方式串通起來,Overloading非常的好用,我們一開始設計功能的時候可能只有非常陽春的功能,隨著需求的收斂,功能越趨完善,此時就能夠根據不同的參數設計出更完整個功能,也不會影響到既有的陽春功能版本,讓合約更具擴充性與相容性。

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

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

-------------------------------------------------------------------------------

喜歡撰寫文章的你,不妨來了解一下:
Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入?

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

資源參考

https://docs.soliditylang.org/en/v0.8.17/contracts.html#function-overloading

留言

這個網誌中的熱門文章

java西元民國轉換_各種不同格式

C#資料庫操作(新增、修改、刪除、查詢)

【Excel好好玩】 自己的資產自己管!善用Google Sheet來幫我們評估貸款

這次介紹的主題是關於Excel的貸款還款計畫試算,我們人生中總會遇到需要大筆金額的花費,但當資金不夠時就得進行貸款,而貸款之前如果我們能夠審慎評估,並分析自己的還款能力之後在進行凍作,相信風險會小很多,因此就自己動動手來使用Google Sheet進行試算吧! 基本資料 ● 貸款總額: 1000000 ● 貸款期數: 84月 ● 年利率: 2.11% ● 月利率: 0.18% P.S 月利率 = 年利率 / 12 重要函式 PMT : 這是Google Sheet內建的重要年金計算公式,我們可以善用這個公式來計算固定利率及期數的固定攤還本息。因為PMT函式計算出的結果為負數,所以前面加上-號轉成正數。 動手做 首先我們在Excel表上列出我們的基本資料 圖片來源 其中月利率的部分就使用公式「=B4/12」 接著我們填上第一列的期數跟餘額 圖片來源 =B2 =B3 使用關鍵PMT函數來計算本息的部分 因為PMT函式計算出的結果為負數,所以前面加上-號轉成正數。 -PMT(貸款利率(月利率), 貸款期數, 貸款總額) =-PMT($B$5,$B$3,$B$2) 圖片來源 計算利息 利息 = 貸款餘額 x 月利率 =B8*$B$5 圖片來源 計算本金 本金 = 本息 - 利息 =C8-D8 圖片來源 製作第二列餘額的部分 餘額的部分 = 上一期的餘額 - 上一期的本金 圖片來源 接著拖曳該兩列往下拉,即可查看每一期的利息與本金 圖片來源 結語 雖然市面上已經有很多貸款銀行都提供了試算功能,但如果我們想要進一步管理自己的資產時,就需要將每一期的金額給計算出來,因此才會將公式運用在Excel表,讓我們的資產管理表能夠結合負債,進一步評估我們理財行動的下一步,希望這樣的經驗可以幫助到正在理財道路上打拼的夥伴,讓我們透過有效的管理,幫助荷包長大吧! 喜歡撰寫文章的你,不妨來了解一下: Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入? 歡迎加入一起練習寫作,賺取知識,累積財富!