c#抽象類和接口的區(qū)別小結(jié)
在 C# 中,抽象類(Abstract Class) 和接口(Interface) 都是實現(xiàn)多態(tài)性的重要機制,用于定義規(guī)范并約束子類 / 實現(xiàn)類的行為,但它們在設(shè)計目的和使用場景上有顯著區(qū)別。
一、相同點
無法實例化 兩者都不能直接創(chuàng)建對象,只能作為父類(抽象類)或契約(接口)被繼承 / 實現(xiàn)。
// 錯誤:無法實例化抽象類 AbstractClass ac = new AbstractClass(); ? // 錯誤:無法實例化接口 IInterface itf = new IInterface();
包含未實現(xiàn)的成員 都可以定義需要子類 / 實現(xiàn)類具體實現(xiàn)的方法(抽象方法 / 接口方法)。
支持多態(tài) 子類 / 實現(xiàn)類的對象可以賦值給抽象類 / 接口類型的變量,調(diào)用時會執(zhí)行具體實現(xiàn)。
// 多態(tài)示例 AbstractClass obj1 = new ConcreteClass(); // 抽象類多態(tài) IInterface obj2 = new InterfaceImpl(); // 接口多態(tài) obj1.AbstractMethod(); // 執(zhí)行子類實現(xiàn) obj2.InterfaceMethod(); // 執(zhí)行實現(xiàn)類方法
二、不同點
特性 | 抽象類(Abstract Class) | 接口(Interface) |
---|---|---|
關(guān)鍵字 | abstract class | interface |
繼承方式 | 單繼承(一個類只能繼承一個抽象類) | 多實現(xiàn)(一個類可以實現(xiàn)多個接口) |
成員類型 | 可包含抽象成員(無實現(xiàn))和具體成員(有實現(xiàn)) | 只能包含抽象成員(默認無實現(xiàn),C# 8.0+ 可加默認實現(xiàn)) |
訪問修飾符 | 成員可以有 public、protected、internal 等修飾符 | 成員默認 public,不能顯式添加其他修飾符 |
字段 / 屬性 | 可以定義字段、普通屬性 | 不能定義字段,只能定義屬性(自動屬性,無字段實現(xiàn)) |
構(gòu)造函數(shù) | 可以有構(gòu)造函數(shù)(供子類調(diào)用) | 不能有構(gòu)造函數(shù) |
方法實現(xiàn) | 可以包含有實現(xiàn)的方法(非抽象方法) | C# 8.0 前:所有方法無實現(xiàn);C# 8.0+:可添加默認實現(xiàn) |
設(shè)計目的 | 表示 "is-a" 關(guān)系(繼承層次,共享代碼) | 表示 "can-do" 關(guān)系(功能契約,規(guī)范行為) |
三、代碼示例
1. 抽象類示例
// 抽象類:包含抽象方法和具體方法 public abstract class Shape { // 字段(抽象類可定義字段) protected string _color; ? // 構(gòu)造函數(shù)(抽象類可有構(gòu)造函數(shù)) public Shape(string color) { _color = color; } ? // 抽象方法(必須由子類實現(xiàn)) public abstract double GetArea(); ? // 具體方法(提供默認實現(xiàn),子類可重寫) public virtual void PrintColor() { Console.WriteLine($"顏色:{_color}"); } } ? // 繼承抽象類(單繼承) public class Circle : Shape { private double _radius; ? public Circle(string color, double radius) : base(color) { _radius = radius; } ? // 實現(xiàn)抽象方法 public override double GetArea() { return Math.PI * _radius * _radius; } }
2. 接口示例
// 接口:定義行為規(guī)范 public interface IMovable { // 接口方法(默認public,無實現(xiàn)) void Move(); ? // C# 8.0+ 可添加默認實現(xiàn) void Stop() { Console.WriteLine("停止移動"); } } ? // 實現(xiàn)接口(可多實現(xiàn)) public class Car : IMovable { // 必須實現(xiàn)接口的抽象方法 public void Move() { Console.WriteLine("汽車行駛中..."); } ? // 可選:重寫接口的默認實現(xiàn) public void Stop() { Console.WriteLine("汽車剎車停止"); } }
四、使用場景選擇
優(yōu)先使用抽象類:
- 需要在多個相關(guān)類間共享代碼(字段、方法實現(xiàn))。
- 定義的是 "is-a" 關(guān)系(如
Shape
與Circle
、Rectangle
)。 - 需要控制成員的訪問權(quán)限(如
protected
方法供子類調(diào)用)。
優(yōu)先使用接口:
- 定義不相關(guān)類的共同行為(如
IMovable
可被Car
、Bird
實現(xiàn))。 - 需要多繼承能力(一個類實現(xiàn)多個接口)。
- 僅需規(guī)范行為,不涉及代碼共享(如框架中的回調(diào)接口)。
總結(jié)
- 抽象類是 "部分實現(xiàn)" 的基類,強調(diào)繼承和代碼復用,適合構(gòu)建類的層次結(jié)構(gòu)。
- 接口是 "純規(guī)范" 的契約,強調(diào)行為一致性,適合跨類別的功能定義。
- 在實際開發(fā)中,兩者常結(jié)合使用(如抽象類實現(xiàn)接口,既提供基礎(chǔ)實現(xiàn)又遵循規(guī)范)。
到此這篇關(guān)于c#抽象類和接口的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)c#抽象類和接口區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#簡單訪問SQLite數(shù)據(jù)庫的方法(安裝,連接,查詢等)
這篇文章主要介紹了C#簡單訪問SQLite數(shù)據(jù)庫的方法,涉及SQLite數(shù)據(jù)庫的下載、安裝及使用C#連接、查詢SQLIte數(shù)據(jù)庫的相關(guān)技巧,需要的朋友可以參考下2016-07-07C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘三 鏈表
這節(jié)我們討論鏈表的基本操作,并且畫圖以證明,下屆中我們將討論雙向鏈表,環(huán)形鏈表 應用舉例2012-11-11利用C#實現(xiàn)獲取與監(jiān)控電腦系統(tǒng)信息
在C#中,獲取與監(jiān)控電腦系統(tǒng)信息通??梢酝ㄟ^多種方式實現(xiàn),這篇文章主要為大家整理了幾種常見的方法及其示例代碼,希望對大家有所幫助2024-11-11