C# 繼承詳解

繼承是面向對象程序設計(OOP)中的核心概念之一,它極大地增強了代碼的重用性、擴展性和維護性。本篇文章將詳細講解C#中的繼承機制,包括基礎概念、語法特法、多重繼承(通過接口實現)、繼承的規則和實際應用示例,幫助你全面理解和掌握C#的繼承特性。


一、什么是繼承?

繼承允許你基于已有的類(稱為基類或父類)定義另一個類(稱為派生類或子類)。派生類繼承了基類所有的成員(字段、方法、屬性),可以直接使用,也可以重寫(Override)以實現不同的行為,或者添加新成員。

敵說:
繼承實現了**"屬于"(IS-A)**關系。例如:

  • 狗(Dog)屬于(IS-A)動物(Animal)
  • 哺乳動物(Mammal)屬于(IS-A)動物
  • 寶馬(BMW)屬于(IS-A) 汽車(Car)

這種關系幫助我們模擬現實世界中的層次結構,簡化設計。


二、C#中定義繼承

1. 基本語法

在C#中,使用冒號(:)表示繼承關系,派生類書寫格式如下:

<訪問修飾符> class <派生類名> : <基類名> {// 成員定義
}

注意事項:

  • 一個派生類只能直接繼承一個基類(單繼承)。
  • 一個基類可以擁有多個派生類(多重派生不可直接支持,但可以用接口模擬)。

2. 示例:定義基礎類和派生類

using System;// 基類
class Animal {public void Eat() {Console.WriteLine("動物會吃東西");}
}// 派生類
class Dog: Animal {public void Bark() {Console.WriteLine("狗會叫");}
}class Program {static void Main() {Dog myDog = new Dog();myDog.Eat();   // 繼承自AnimalmyDog.Bark();  // 自己的方法}
}

在這個例子中,Dog繼承自Animal,無須在Dog中重新定義Eat()方法。


三、繼承的細節與規則

1. 隱式繼承

  • 派生類自動繼承基類的公共(public)和受保護(protected)成員。
  • 私有(private)成員不被繼承,但子類可以通過公共或受保護的方法訪問。

2. 構造函數

  • 基類的構造函數在派生類實例化時自動調用。
  • 如果基類含有參數化構造函數,派生類必須在構造函數中顯式調用base()

示例:

class Person {public string Name;public Person(string name) {Name = name;}
}class Student : Person {public int Grade;public Student(string name, int grade): base(name) {Grade = grade;}
}

?

3. 方法的重寫

  • 父類中的方法必須聲明為virtual,子類需要使用override關鍵字重寫。
  • 這允許派生類根據需求定制行為。

示例:

class Animal {public virtual void MakeSound() {Console.WriteLine("動物發出聲音");}
}class Cat : Animal {public override void MakeSound() {Console.WriteLine("喵喵");}
}

4. 訪問修飾符影響繼承

  • public:無限制訪問
  • protected:子類可以訪問
  • private:不可被繼承方訪問,子類不可訪問
  • internal:同程序集可訪問
  • protected internal:保護和內部的結合

四、示例:繼承實現“形狀”和“矩形”

1. 定義基類Shape

using System;namespace InheritanceDemo {class Shape {protected int width, height;public void SetDimensions(int w, int h) {width = w;height = h;}public virtual int Area() {return 0; // 只是一個占位符}}class Rectangle : Shape {public override int Area() {return width * height;}}class Program {static void Main() {Rectangle rect = new Rectangle();rect.SetDimensions(10, 5);Console.WriteLine("矩形面積: " + rect.Area());}}
}

輸出:

矩形面積: 50

這個例子展現了覆蓋(重寫)Area()方法,實現了多態性。


五、繼承的擴展——多重繼承(通過接口實現)

C#不支持多繼承(一個類繼承多個類),為了實現類似效果,推薦使用接口(interface)

1. 接口簡介

接口定義了一組抽象方法和屬性,但沒有實現。類可以實現多個接口,實現多繼承的效果。

2. 例子:用接口模擬多重繼承

using System;public interface IShape {double Area();
}public interface IColor {string GetColor();
}class Circle : IShape, IColor {private double radius;public Circle(double r) {radius = r;}public double Area() {return Math.PI * radius * radius;}public string GetColor() {return "紅色";}
}class Program {static void Main() {Circle c = new Circle(5);Console.WriteLine("面積: " + c.Area());Console.WriteLine("顏色: " + c.GetColor());}
}

輸出:

面積: 78.5398163397448
顏色: 紅色

這里,Circle實現了兩個接口,達到了多重繼承的效果。


六、繼承中常見的應用技巧

  • 隱藏繼承(隱藏基類成員):子類可以用new關鍵字隱藏繼承的成員。
  • 調用基類成員:可以用base關鍵字訪問基類成員,或調用基類構造函數。
  • 構造函數調用:派生類在構造函數中調用基類的構造函數。

示例:

class Base {public virtual void Method() {Console.WriteLine("Base方法");}
}class Derived : Base {public override void Method() {base.Method(); // 調用基類方法Console.WriteLine("派生類方法");}
}

七、總結

  • 繼承是實現代碼復用和模型表達的重要手段。
  • C#只支持單繼承,但可用interface實現多繼承。
  • 通過virtualoverride實現多態。
  • 使用繼承時應合理設計“IS-A”關系,避免不合理的關系設定。

八、結語

掌握C#中的繼承,是成為一名優秀面向對象開發者的必要條件。合理設計繼承樹,不僅可以提升開發效率,還能增強程序的擴展性和可維護性。希望本篇文章能為你提供系統、全面的理解,助你在實踐中靈活應用。


祝你編程順利!

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

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

相關文章

SQLAlchemy 2.x 異步查詢方法比較

SQLAlchemy 2.x 異步查詢中常用的 結果處理方法速查表&#xff0c;包含方法說明、使用場景、返回類型及典型用途。 SQLAlchemy 查詢結果處理方法速查表&#xff08;適用于 AsyncSession&#xff09; 方法 說明 返回類型 示例 SQL 示例輸出 scalars().all() 獲取單列所有…

極客天成參與”AI助力智慧城市構建”主題演講暨招商引智專題推介活動

4月7日下午&#xff0c;北京極客天成科技有限公司參加了天津市河東區數據局舉辦的“AI賦能智慧城市構建”主題演講暨招商引智專題推介活動。 活動中&#xff0c;華為&#xff08;天津&#xff09;有限公司數字政府解決方案總監姜華庚圍繞“政務大模型賦能智慧城市建設”&#x…

理解 EKS CloudWatch Pod CPU Utilization 指標:與 `kubectl top` 及節點 CPU 的關系

在使用 AWS EKS 時&#xff0c;CloudWatch Container Insights 提供了豐富的容器級別監控指標&#xff0c;幫助我們深入了解應用的運行狀態。如下截圖中的 ContainerInsights pod_cpu_utilization 指標就是一個非常重要的維度。本文將詳細解釋這個指標的含義&#xff0c;并將其…

使用pip3安裝軟件包報錯`externally-managed-environment`的幾種解決方式

1、pip3安裝軟件包報錯 報錯externally-managed-environment的原因&#xff1a; 從 Python 3.11 開始引入了 PEP 668 規范&#xff0c;該規范限制了在系統級 Python 環境中使用 pip 安裝第三方包&#xff0c;以避免與系統包管理器&#xff08;如 apt&#xff09;產生沖突。 如…

spring security用戶退出

Spring security默認實現了用戶退出的功能&#xff0c;用戶退出主要考慮退出后會話如何管理以及跳轉到哪個頁面。HttpSecurity類提供了logout()方法開啟退出登錄的支持&#xff0c;默認觸發用戶退出操作的URL為“/logout”&#xff0c;用戶退出時同時也會清除Session等默認用戶…

愛普生SG2520HHN晶振數據中心服務器的理想解決方案

在當今數字化時代&#xff0c;數據中心作為海量數據存儲、處理與傳輸的核心樞紐&#xff0c;其服務器的高效穩定運行至關重要。服務器作為其核心設備&#xff0c;對時鐘信號的精度和穩定性提出了嚴苛要求——微小的時序誤差可能導致數據傳輸失敗或系統宕機。愛普生 SG2520HHN 差…

LeetCode 155題解 | 最小棧

最小棧 一、題目鏈接二、題目三、算法原理思路1&#xff1a;用一個變量存儲最小元素思路2&#xff1a;雙棧普通棧和最小棧 四、編寫代碼五、時間復雜度 一、題目鏈接 最小棧 二、題目 三、算法原理 棧用數組、鏈表實現都行&#xff0c;最主要的就是在能在常數時間內檢索到最…

es+kibana---集群部署

其實一般es要跑3個節點的&#xff0c;這樣才能做高可用&#xff0c;處理并發大&#xff0c;但是我這里只是一個pod mkdir -p /stroe/data/es es搭建&#xff1a; #【拉取鏡像】 #docker pull elasticsearch:6.8.7 #docker pull busybox:1.28 【導入鏡像】 docker load -i es.…

WPF常用技巧匯總 - Part 2

WPF常用技巧匯總-CSDN博客 主要用于記錄工作中發現的一些問題和常見的解決方法。 目錄 WPF常用技巧匯總-CSDN博客 1. DataGrid Tooltip - Multiple 2. DataGrid Tooltip - Cell值和ToolTip值一樣 3. DataGrid Tooltip - Cell值和ToolTip值不一樣 4. DataGrid - Ctrl A /…

uniapp打包apk如何實現版本更新

我們做的比較簡單&#xff0c;在后端設置版本號&#xff0c;并在uniapp的config.js中定義版本號&#xff0c;每次跟后端的進行對比&#xff0c;不一致的話就更新。 一、下載apk 主要代碼&#xff08;下載安裝包&#xff0c;并進行安裝&#xff0c;一般得手動同意安裝&#xf…

局部和整體的關系

Prompt&#xff1a;為什么要研究局部和整體的關系呢&#xff1f;是因為很多情況下&#xff0c;局部就能表達出整體&#xff1f; 這是一個非常本質的問題&#xff0c;其實你已經接近數學和物理中“幾何本質”的核心了。我們研究局部和整體的關系&#xff0c;是因為&#xff1a;…

企業辦公協同平臺安全一體化生態入住技術架構與接口標準分析報告

全球組織數字化與智能化背景下 企業辦公協同平臺安全一體化生態入住技術架構與接口標準分析報告 一、背景與市場需求 市場規模與增量 根據Statista數據&#xff0c;全球協同辦公平臺市場規模預計從2023年的$480億增長至2027年的$900億&#xff0c;年復合增長率&#xff08;CAG…

【2025最新面試八股常問知識點】HTTP1.0,HTTP1.1,HTTP2.0,HTTP3.0,HTTP的進化之路。

HTTP 超文本傳輸協議&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;縮寫&#xff1a;HTTP&#xff09;是一種用于分布式、協作式和超媒體信息系統的應用層協議。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。通過HTTP或者HTTPS協議請求的…

【算法練習】歸并排序和歸并分治

文章目錄 1.歸并排序1.1 遞歸版本1.2 非遞歸版本 2.歸并分治2.1 計算數組的小和2.2 計算翻轉對 1.歸并排序 歸并排序的核心步驟是&#xff1a; 拆分&#xff1a;將無序數組不斷對半拆分成小塊&#xff0c;直到每個小塊只剩一個元素&#xff08;自然有序&#xff09;。 合并&a…

域對齊是什么

域對齊&#xff08;Domain Alignment&#xff09;是在機器學習和計算機視覺等領域中常用的技術 定義 域對齊旨在將不同域&#xff08;Domain&#xff09;的數據映射到一個共同的特征空間中&#xff0c;使得來自不同域的數據在該空間中具有相似的分布。這里的“域”可以指代不…

【linux】git安裝、升級

git安裝、升級 一、快捷安裝版本2.18.0二、自定義版本安裝&#xff08;安裝、升級&#xff09;1、移除舊文件2、安裝所需依賴3、選擇指定版本4、解壓文件、編譯5、增加環境變量&#xff0c;驗證是否版本 三、升級 一、快捷安裝版本2.18.0 yum install git git --version二、自…

編程日志4.24

棧的鏈表基礎表示結構 #include<iostream> #include<stdexcept> using namespace std; //模板聲明&#xff0c;表明Stack類是一個通用的模板&#xff0c;可以用于存儲任何類型的元素T template<typename T> //棧的聲明 //Stack類的聲明&#xff0c;表示一…

《冰雪傳奇點卡版》:探索冰雪世界的傳奇旅程!

《冰雪傳奇點卡版》以“純凈打金”為核心&#xff0c;摒棄復雜付費坑&#xff0c;回歸經典傳奇玩法。以下從核心玩法、資源獲取、職業搭配、交易變現四維度展開&#xff0c;助你高效開啟冰雪傳奇之旅。 一、核玩法解析&#xff1a;如何高效獲取資源&#xff1f; 1. 職業定位與…

DeepClaude開源程序可以實現代碼生成、創作詩句以及內容創作等功能

一、軟件介紹 文末提供程序和源碼下載 DeepClaude開源程序是增強的 AI&#xff0c;可以實現代碼生成&#xff1a;DeepSeek r1 Claude 3.7 十四行詩 - 無與倫比的性能&#xff01;內容創作&#xff1a;DeepSeek r1 Gemini 2.5 Pro - 卓越的質量&#xff01;OpenAI 兼容。流媒…

Java常用注解通俗解釋

注解就像是給Java代碼貼的"便利貼"&#xff0c;它們不會改變代碼本身的邏輯&#xff0c;但能給編譯器、開發工具或運行時環境提供額外信息。下面我用最通俗的方式解釋Java中最常用的注解&#xff1a; 一、基礎篇&#xff1a;人人必知的注解 1. Override - "我…