我們上一篇有介紹了「 【開發智能合約 - 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