最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#抽象類?(abstract?class)?vs?接口?(interface)?選型與應(yīng)用場景分析

 更新時(shí)間:2026年06月04日 08:49:41   作者:人生就是修煉  
在C#中,抽象類(abstract class)和接口(interface)是實(shí)現(xiàn)面向?qū)ο笤O(shè)計(jì)中的多態(tài)性和代碼復(fù)用的兩種主要機(jī)制,雖然它們都可以用于定義方法的簽名和實(shí)現(xiàn)共享的屬性,但它們在設(shè)計(jì)理念、使用場景和靈活性方面存在顯著差異,下面詳細(xì)介紹它們各自的特性和應(yīng)用場景

一、核心區(qū)別(選型依據(jù))

特性抽象類接口
繼承單繼承,一個(gè)類只能繼承一個(gè)抽象類多實(shí)現(xiàn),一個(gè)類可實(shí)現(xiàn)多個(gè)接口
成員可包含字段、構(gòu)造函數(shù)、實(shí)例方法、靜態(tài)成員、抽象/普通屬性、虛方法不能有字段、構(gòu)造函數(shù)、實(shí)例變量,默認(rèn)public,C#8+可加默認(rèn)實(shí)現(xiàn)方法
訪問修飾可任意:private/protected/public默認(rèn)public,不能手動(dòng)寫訪問修飾符
代碼復(fù)用共享實(shí)例字段、公共邏輯代碼只定義契約,默認(rèn)無實(shí)例狀態(tài)
版本兼容新增普通方法子類不受影響C#7.3及以前新增方法會(huì)導(dǎo)致所有實(shí)現(xiàn)類報(bào)錯(cuò);C#8+默認(rèn)實(shí)現(xiàn)緩解

關(guān)鍵判斷口訣:有共同狀態(tài)/復(fù)用代碼用抽象類;多套能力契約、多組合用接口

二、抽象類適用場景(優(yōu)先選abstract class)

1. 多個(gè)子類存在共同字段、共同實(shí)例狀態(tài)

子類擁有相同屬性(如Name、Id),把公共字段抽到父類。
例:Animal(抽象類):含Age字段、公共喂食邏輯;Dog/Cat繼承,只實(shí)現(xiàn)抽象Shout()

abstract class Animal
{
    public int Age { get; set; } // 公共狀態(tài)
    public void Eat() => Console.WriteLine("進(jìn)食"); // 公共實(shí)現(xiàn)
    public abstract void Shout();
}
class Dog : Animal { public override void Shout() => Console.WriteLine("汪汪"); }

2. 大量子類復(fù)用通用業(yè)務(wù)邏輯,僅部分方法需要子類重寫

部分邏輯固定不變,只有個(gè)別行為由子類個(gè)性化實(shí)現(xiàn)。

  • 場景:數(shù)據(jù)庫操作基類BaseDao:封裝通用連接、分頁查詢,抽象Add/Delete由不同表Dao實(shí)現(xiàn)。

3. 需要構(gòu)造函數(shù)初始化共同數(shù)據(jù)

抽象類可以寫構(gòu)造,約束子類實(shí)例化時(shí)初始化公共成員;接口無構(gòu)造。

4. 具有強(qiáng)父子層級關(guān)系(is-a)

狗是動(dòng)物、轎車是交通工具 屬于繼承關(guān)系,用抽象類。

三、接口適用場景(優(yōu)先選interface)

1. 類需要多套不同功能能力(can-do,能力組合)

一個(gè)類兼具多種無關(guān)功能,不能多繼承,只能多接口。
例:麻雀:繼承Bird(抽象類),同時(shí)實(shí)現(xiàn)IFly(飛行)、IEgg(產(chǎn)卵)兩個(gè)接口;飛機(jī)實(shí)現(xiàn)IFly但和鳥類無繼承關(guān)系。

interface IFly { void Fly(); }
interface ILayEgg { void Lay(); }
abstract class Bird{}
class Sparrow : Bird, IFly, ILayEgg
{
    public void Fly(){}
    public void Lay(){}
}

2. 只定義行為契約,不需要共享字段和實(shí)例數(shù)據(jù)

只規(guī)范方法/屬性簽名,實(shí)現(xiàn)類各自維護(hù)內(nèi)部數(shù)據(jù)。

  • 場景:IEnumerableIDisposable、IComparable 框架原生接口。

3. 跨繼承層級統(tǒng)一規(guī)范能力

毫無繼承關(guān)系的類實(shí)現(xiàn)同一套規(guī)范:FileStream、MemoryStream無共同父類,但都實(shí)現(xiàn)IDisposable釋放資源。

4. 依賴倒置、面向接口編程(DI依賴注入)

框架分層:Service層依賴接口IUserService,不依賴具體實(shí)現(xiàn)UserService,方便替換Mock、不同實(shí)現(xiàn)。

5. C#8+默認(rèn)實(shí)現(xiàn):接口新增通用邏輯

需要給一批實(shí)現(xiàn)類追加通用方法但不想改動(dòng)已有子類時(shí),接口寫默認(rèn)方法。

四、快速選型決策流程

  • 是is-a(父子繼承)還是can-do(具備某個(gè)能力)?
    • is-a、有共同屬性/公共代碼 → 抽象類
    • can-do、附加能力、多組合 → 接口
  • 是否需要多繼承多個(gè)規(guī)范?需要多套功能 → 接口;只能單一父類 → 抽象類
  • 是否存在公共實(shí)例字段、構(gòu)造函數(shù)?有成員變量 → 抽象類;只定義方法簽名 → 接口

五、經(jīng)典組合用法(項(xiàng)目最常用)

抽象類+接口搭配:抽象類承載同系列公共代碼,接口定義擴(kuò)展能力。
示例:

// 接口:定義可排序能力
interface ISort { void Sort(); }
// 抽象類:集合公共基類,封裝公共成員
abstract class BaseCollection
{
    protected object[] _items; // 公共存儲字段
    public int Count => _items.Length;
}
// 具體類:繼承抽象類 + 實(shí)現(xiàn)接口
class ListCollection : BaseCollection, ISort
{
    public void Sort() { /*自己實(shí)現(xiàn)排序*/ }
}

六、避坑總結(jié)

  • 能用接口就不要隨便用抽象類:抽象類限制單繼承,擴(kuò)展性差;
  • 有大量重復(fù)業(yè)務(wù)代碼和實(shí)體字段,別強(qiáng)行拆成多個(gè)接口,改用抽象類減少冗余;
  • 框架擴(kuò)展、插件化開發(fā)優(yōu)先接口,方便后期替換實(shí)現(xiàn)類。

到此這篇關(guān)于C#抽象類 (abstract class) vs 接口 (interface) 選型與應(yīng)用場景的文章就介紹到這了,更多相關(guān)C#抽象類 (abstract class) vs 接口 (interface) 選型與應(yīng)用場景內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

忻城县| 鹤山市| 石泉县| 昌平区| 南靖县| 黎城县| 保定市| 高要市| 方城县| 石台县| 白沙| 高要市| 崇信县| 江油市| 枣庄市| 邢台市| 仁布县| 湘西| 吴江市| 论坛| 会同县| 靖州| 湾仔区| 麦盖提县| 高淳县| 长宁区| 象州县| 连州市| 台北县| 临邑县| 乐山市| 平顶山市| 苏尼特右旗| 青川县| 尼勒克县| 怀仁县| 聂拉木县| 合山市| 耒阳市| 建阳市| 瑞安市|