Solidity學習 - 繼承

文章目錄

    • 前言
    • 繼承的基本概念
    • 繼承的基本用法
      • 單繼承實現
      • 函數重寫(overriding)
    • 構造函數的繼承處理
    • 多重繼承
    • 抽象合約

前言

繼承是面向對象編程中的核心概念之一,Solidity作為一種面向對象的智能合約語言,同樣支持繼承機制。通過繼承,開發者可以實現代碼重用、功能擴展,使合約結構更加清晰。本文將詳細介紹Solidity中繼承的使用方法、特性及最佳實踐。

繼承的基本概念

繼承允許一個合約(子類或派生合約)從另一個合約(父類或基類)繼承屬性和方法,帶來以下優勢:

  • 代碼重用:避免重復編寫相同的屬性和方法
  • 方便擴展:在父合約基礎上添加新功能
  • 提高可維護性:建立清晰的合約層次關系

在實際開發中,繼承使得我們可以使用大量第三方合約庫(如OpenZeppelin)來簡化開發工作。例如,ERC20標準合約作為父合約,不同的代幣合約可以繼承它并添加自定義功能。

繼承的基本用法

單繼承實現

Solidity使用is關鍵字表示合約的繼承關系:

pragma solidity ^0.8.0;
contract Base {uint public a;
}contract Sub is Base {uint public b;constructor() {b = 2;}
}

部署Sub合約后,可以看到它擁有兩個屬性:a(繼承自Base)和b(自身定義)。派生合約會繼承父合約內的所有非私有(private)成員:

訪問修飾符publicexternalinternalprivate
可被繼承????

函數重寫(overriding)

只有父合約中的虛函數(使用virtual關鍵字修飾)可以在派生合約中重寫,重寫函數需要使用override關鍵字:

pragma solidity >=0.8.0;
contract Base {uint public a;function foo() virtual public {a += 2;}
}contract Sub is Base {function foo() public override {a += 1;}
}

調用Subfoo函數后,a的值會增加1,因為父合約的函數被遮蔽。如果需要在重寫函數中調用父合約的實現,可以使用super關鍵字:

contract Sub is Base {function foo() public override {super.foo(); // 調用父合約的foo函數a += 1;}
}

此時調用foo函數,a的值會先增加2(父合約邏輯),再增加1(當前合約邏輯),總共增加3。

構造函數的繼承處理

當派生合約繼承父合約時,父合約的構造函數會在派生合約部署時自動執行:

contract Base {uint public a;constructor() {a = 1;}
}contract Sub is Base {uint public b;constructor() {b = 2;}
}

部署Sub合約后,a的值為1(父合約構造函數執行結果),b的值為2(派生合約構造函數執行結果)。

如果父合約構造函數需要參數,有兩種傳參方式:

  1. 在繼承時指定參數:
contract Base {uint public a;constructor(uint _a) {a = _a;}
}contract Sub is Base(1) {uint public b;constructor() {b = 2;}
}
  1. 在派生構造函數中使用修飾符方式調用:
contract Sub is Base {uint public b;constructor() Base(1) {b = 2;}
}

多重繼承

Solidity支持多重繼承,即一個合約可以從多個父合約繼承:

contract Sub is Base1, Base2 {// 實現代碼
}

在多重繼承中,如果多個父合約之間存在繼承關系,必須按照"父合約在前,子合約在后"的順序書寫,否則會編譯出錯:

contract X {}
contract A is X {}
contract C is A, X {} // 編譯出錯,X是A的父合約,應放在前面

如果多個父合約定義了同名函數,重寫時需要在override后指定所有父合約名:

pragma solidity >=0.8.0;
contract Base1 {function foo() virtual public {}
}contract Base2 {function foo() virtual public {}
}contract Inherited is Base1, Base2 {function foo() public override(Base1, Base2) {}
}

抽象合約

抽象合約是一種特殊的父合約,用于定義合約結構而不被直接部署,使用abstract關鍵字聲明:

abstract contract Base {uint public a;
}

抽象合約可以包含沒有具體實現的純虛函數,純虛函數聲明以;結尾:

pragma solidity >=0.8.0;
abstract contract Base {function get() virtual public; // 純虛函數,無函數體
}

派生合約必須實現抽象合約中的所有純虛函數,否則自身也必須聲明為抽象合約。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88989.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88989.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88989.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

依賴注入(Dependency Injection, DI)的核心概念和解決的核心問題

核心概念: 依賴注入是一種設計模式,也是實現控制反轉(Inversion of Control, IoC) 原則的一種具體技術。其核心思想是: 解耦: 將一個類(客戶端)所依賴的其他類或服務(依…

Reactor Schedulers

Reactor 是一個基于響應式編程的庫,它提供了豐富的調度器(Schedulers)機制,用于管理異步操作的執行環境。Schedulers 是 Reactor 中的核心組件之一,它們允許開發者靈活地控制操作符和訂閱操作在哪個線程上執行&#xf…

設備樹引入

一、設備樹的基本知識 1、什么是設備樹?為什么會有設備樹? 2011年,Linux之父Linus Torvalds發現這個問題后,就通過郵件向ARM-Linux開發社區發了一封郵件,不禁的發出了一句“This whole ARM thing is a f*cking pain i…

【數據標注師】3D標注

目錄 一、 **3D標注知識體系框架**二、 **五階能力培養體系**? **階段1:空間認知筑基(2-3周)**? **階段2:核心標注技能深化**? **階段3:復雜場景解決方案**? **階段4:領域深度專精? **階段5&#xff1…

華為HN8145V光貓改華為藍色公版界面,三網通用,xgpon公版光貓

咸魚只賣20多元一個,還是xgpon的萬兆貓,性價比不錯哦 除了沒有2.5G網口,其他還行。 改成公版光貓后,運營商是無法納管光貓,無法后臺修改光貓數據及超密。 華為 HN8145V 光貓具有以下特點: 性能方面 高速接…

【LeetCode 熱題 100】438. 找到字符串中所有字母異位詞——(解法二)定長滑動窗口+數組

Problem: 438. 找到字符串中所有字母異位詞 題目:給定兩個字符串 s 和 p,找到 s 中所有 p 的 異位詞 的子串,返回這些子串的起始索引。不考慮答案輸出的順序。 【LeetCode 熱題 100】438. 找到字符串中所有字母異位詞——(解法一&…

PAC 學習框架:機器學習的可靠性工程

PAC(Probably Approximately Correct) 是機器學習理論的核心框架,用于量化學習算法的可靠性。它回答了一個關鍵問題: “需要多少訓練樣本,才能以較高概率學到一個近似正確的模型?” 一、PAC 名稱拆解 術語…

嵌入式C語言數組:數組/字符數組

1. 數組 1.1 一維數組 數組是一串連續的地址; 數組名是地址常量,代表數組的起始地址; sizeof(數組名) 可得出數組的總內存空間; C 語言對數組不做越界檢查,使用時應注意; 數組不…

變長字節的數字表示法vb224

開始 數字有大有小,用多少字節表示呢? 本文描述的方案,采用變化的長度。vb是varying bytes的意思,224是表示它特征的一個數。 第一版: 每個字節8比特,最高的1比特用來表示“是否連續”,0表示…

ByteMD+CozeAPI+Coze平臺Agent+Next搭建AI輔助博客撰寫平臺(邏輯清楚,推薦!)

背景: 現在主流的博客平臺AI接入不夠完善,如CSDN接入的AI助手不支持多模態數據的交互、稀土掘金的編輯器AI功能似乎還沒能很好接入(哈哈哈,似乎在考慮布局什么?) 痛點分析: 用戶常常以截圖的形式…

【數據標注師】關鍵詞標注

目錄 一、 **理解關鍵詞標注的核心邏輯**1. **三大標注原則**2. **關鍵詞類型體系** 二、 **四階訓練體系**? **階段1:基礎規則內化**? **階段2:語義濃縮訓練**? **階段3:場景化標注策略**? **階段4:工具效率提升** 三、 **五…

for each循環語句

for each循環語句 for each.....nextFor Each 的案例 for each…next 1、循環對象合集 worksheets workbooks range range("區域")selection (選中的區域)usedrange或者currentregion 返回的單元格區域格式: for each 變量名 in 對象集合(范圍)循環內容…

基于LQR控制器的六自由度四旋翼無人機模型simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序 4.系統原理簡介 5.參考文獻 6.完整工程文件 1.課題概述 四旋翼無人機因其結構簡單、機動性強和成本低廉等特點,在航拍測繪、物流運輸、災害救援等領域得到廣泛應用。六自由度(3維平移3維旋轉&#xff0…

vftp centos 離線部署

install_ftp_offline.sh vsftpd-3.0.2-28.el7.x86_64.rpm #!/bin/bash# 一鍵安裝配置vsftpd腳本(開放根目錄,禁用chroot)# 安裝vsftpd RPM包 echo "正在安裝vsftpd..." rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm if [ $? -ne 0 …

【數據標注】事件標注1

目錄 **一、 深入理解事件標注的核心概念****二、 系統學習:從理論到實踐****1. 吃透標注指南****2. 語言學基礎補充****3. 事件結構解析訓練** **三、 分階段實踐:從簡單到復雜****階段1:基礎標注訓練****階段2:進階挑戰****階段…

在 Ansys Electronics Desktop 中啟用額外的 CPU 內核和 GPU

Ansys Electronics Desktop (AEDT) 可以通過利用多個 CPU 內核和 GPU 加速來顯著縮短仿真時間。但是,啟用其他計算資源除了基本求解器許可證外,還需要適當的高性能計算 (HPC) 許可證。 默認情況下,基本許可證最多允許使用 4 個內核,而無需任何其他 HPC 許可。借助 Ans…

R語言機器學習算法實戰系列(二十六)基于tidymodels的XGBoost二分類器全流程實戰

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹加載R包數據準備數據探索轉換因子查看屬性相關性配對圖PCA 可視化缺失值、異常值處理 & 特征標準數據分割構建模型與調參模型評估模型可解釋性(變量重要性、SHAP、DALEX)變量…

零基礎langchain實戰一:模型、提示詞和解析器

一,使用python調取大模型api 1,獲取api_key 獲取api_key 在各個大模型的官網中獲取。 2,設置api_key 方式一: 在系統環境中可直接執行python代碼:這里以deepseek為例 import os os.environ["DEEPSEEK_API_…

Pytorch分布式通訊為什么要求Tensor連續(Contiguous)

參考資料: https://github.com/pytorch/pytorch/issues/73515 https://www.cnblogs.com/X1OO/articles/18171700 由于業務原因,需要在Pytorch代碼中使用分布式通訊來把計算負載平均到多張顯卡上。在無數次確認我的業務代碼沒問題之后,我開始把…

關于前端頁面上傳圖片檢測

依賴于前文,linux系統上部署yolo識別圖片,遠程宿主機訪問docker全流程(https://blog.csdn.net/yanzhuang521967/article/details/148777650?spm1001.2014.3001.5501) fastapi把端口暴露出來 后端代碼 from fastapi import FastAPI, UploadFile, File, HTTPExcep…