c#抽象類和接口的區(qū)別小結(jié)
在 C# 中,抽象類(Abstract Class) 和接口(Interface) 都是實(shí)現(xiàn)多態(tài)性的重要機(jī)制,用于定義規(guī)范并約束子類 / 實(shí)現(xiàn)類的行為,但它們?cè)谠O(shè)計(jì)目的和使用場(chǎng)景上有顯著區(qū)別。
一、相同點(diǎn)
無(wú)法實(shí)例化 兩者都不能直接創(chuàng)建對(duì)象,只能作為父類(抽象類)或契約(接口)被繼承 / 實(shí)現(xiàn)。
// 錯(cuò)誤:無(wú)法實(shí)例化抽象類 AbstractClass ac = new AbstractClass(); ? // 錯(cuò)誤:無(wú)法實(shí)例化接口 IInterface itf = new IInterface();
包含未實(shí)現(xiàn)的成員 都可以定義需要子類 / 實(shí)現(xiàn)類具體實(shí)現(xiàn)的方法(抽象方法 / 接口方法)。
支持多態(tài) 子類 / 實(shí)現(xiàn)類的對(duì)象可以賦值給抽象類 / 接口類型的變量,調(diào)用時(shí)會(huì)執(zhí)行具體實(shí)現(xiàn)。
// 多態(tài)示例 AbstractClass obj1 = new ConcreteClass(); // 抽象類多態(tài) IInterface obj2 = new InterfaceImpl(); // 接口多態(tài) obj1.AbstractMethod(); // 執(zhí)行子類實(shí)現(xiàn) obj2.InterfaceMethod(); // 執(zhí)行實(shí)現(xiàn)類方法
二、不同點(diǎn)
| 特性 | 抽象類(Abstract Class) | 接口(Interface) |
|---|---|---|
| 關(guān)鍵字 | abstract class | interface |
| 繼承方式 | 單繼承(一個(gè)類只能繼承一個(gè)抽象類) | 多實(shí)現(xiàn)(一個(gè)類可以實(shí)現(xiàn)多個(gè)接口) |
| 成員類型 | 可包含抽象成員(無(wú)實(shí)現(xiàn))和具體成員(有實(shí)現(xiàn)) | 只能包含抽象成員(默認(rèn)無(wú)實(shí)現(xiàn),C# 8.0+ 可加默認(rèn)實(shí)現(xiàn)) |
| 訪問(wèn)修飾符 | 成員可以有 public、protected、internal 等修飾符 | 成員默認(rèn) public,不能顯式添加其他修飾符 |
| 字段 / 屬性 | 可以定義字段、普通屬性 | 不能定義字段,只能定義屬性(自動(dòng)屬性,無(wú)字段實(shí)現(xiàn)) |
| 構(gòu)造函數(shù) | 可以有構(gòu)造函數(shù)(供子類調(diào)用) | 不能有構(gòu)造函數(shù) |
| 方法實(shí)現(xiàn) | 可以包含有實(shí)現(xiàn)的方法(非抽象方法) | C# 8.0 前:所有方法無(wú)實(shí)現(xiàn);C# 8.0+:可添加默認(rèn)實(shí)現(xiàn) |
| 設(shè)計(jì)目的 | 表示 "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;
}
?
// 抽象方法(必須由子類實(shí)現(xiàn))
public abstract double GetArea();
?
// 具體方法(提供默認(rèn)實(shí)現(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;
}
?
// 實(shí)現(xiàn)抽象方法
public override double GetArea()
{
return Math.PI * _radius * _radius;
}
}2. 接口示例
// 接口:定義行為規(guī)范
public interface IMovable
{
// 接口方法(默認(rèn)public,無(wú)實(shí)現(xiàn))
void Move();
?
// C# 8.0+ 可添加默認(rèn)實(shí)現(xiàn)
void Stop()
{
Console.WriteLine("停止移動(dòng)");
}
}
?
// 實(shí)現(xiàn)接口(可多實(shí)現(xiàn))
public class Car : IMovable
{
// 必須實(shí)現(xiàn)接口的抽象方法
public void Move()
{
Console.WriteLine("汽車行駛中...");
}
?
// 可選:重寫接口的默認(rèn)實(shí)現(xiàn)
public void Stop()
{
Console.WriteLine("汽車剎車停止");
}
}四、使用場(chǎng)景選擇
優(yōu)先使用抽象類:
- 需要在多個(gè)相關(guān)類間共享代碼(字段、方法實(shí)現(xiàn))。
- 定義的是 "is-a" 關(guān)系(如
Shape與Circle、Rectangle)。 - 需要控制成員的訪問(wèn)權(quán)限(如
protected方法供子類調(diào)用)。
優(yōu)先使用接口:
- 定義不相關(guān)類的共同行為(如
IMovable可被Car、Bird實(shí)現(xiàn))。 - 需要多繼承能力(一個(gè)類實(shí)現(xiàn)多個(gè)接口)。
- 僅需規(guī)范行為,不涉及代碼共享(如框架中的回調(diào)接口)。
總結(jié)
- 抽象類是 "部分實(shí)現(xiàn)" 的基類,強(qiáng)調(diào)繼承和代碼復(fù)用,適合構(gòu)建類的層次結(jié)構(gòu)。
- 接口是 "純規(guī)范" 的契約,強(qiáng)調(diào)行為一致性,適合跨類別的功能定義。
- 在實(shí)際開發(fā)中,兩者常結(jié)合使用(如抽象類實(shí)現(xiàn)接口,既提供基礎(chǔ)實(shí)現(xiàn)又遵循規(guī)范)。
到此這篇關(guān)于c#抽象類和接口的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)c#抽象類和接口區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#調(diào)用usb攝像頭的實(shí)現(xiàn)方法
這篇文章主要介紹了C#調(diào)用usb攝像頭的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
一文教你如何使用C#開發(fā)一個(gè)Windows后臺(tái)服務(wù)
這篇文章主要為大家詳細(xì)介紹了如何基于C#實(shí)現(xiàn)Windows服務(wù)的創(chuàng)建、安裝、啟動(dòng)、停止和卸載,并展示具體的代碼示例和操作步驟,需要的小伙伴可以了解下2025-08-08
C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信(簡(jiǎn)單的聊天系統(tǒng))
這篇文章主要介紹了C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信(簡(jiǎn)單的聊天系統(tǒng)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
C#中使用IrisSkin2.dll美化WinForm程序界面的方法
這篇文章主要介紹了c#中使用IrisSkin2.dll美化WinForm程序界面的實(shí)現(xiàn)方法,需要的朋友可以參考下2013-05-05
C#中使用基數(shù)排序算法對(duì)字符串進(jìn)行排序的示例
Radix Sort基數(shù)排序是非比較型的排序算法,其時(shí)間復(fù)雜度是O(k·n),n為元素個(gè)數(shù),為數(shù)字位數(shù),這里我們就來(lái)看一下C#中使用基數(shù)排序算法堆字符串進(jìn)行排序的示例2016-06-06
C#/C++ 通過(guò)ODBC連接OceanBase Oracle租戶的詳細(xì)過(guò)程
近期我們項(xiàng)目正處于將Oracle數(shù)據(jù)庫(kù)遷移到OceanBase Oracle租戶模式的階段,考慮到我們項(xiàng)目采用了C++和C#混合開發(fā),并且使用了多種技術(shù),因此存在多種數(shù)據(jù)庫(kù)連接方式,C#連接OceanBase的案例相對(duì)較少,因此我特意記錄下這一過(guò)程,感興趣的朋友一起看看吧2024-05-05

