欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#抽象類和接口的區(qū)別小結(jié)

 更新時間:2025年07月27日 09:35:47   作者:張謹?shù)W  
C#中抽象類和接口都支持多態(tài)性,但存在關(guān)鍵區(qū)別,實際開發(fā)中常組合使用,抽象類提供基礎(chǔ)實現(xiàn),接口確保規(guī)范一致性,下面就來介紹一下兩者的區(qū)別,感興趣的可以了解一下

在 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 classinterface
繼承方式單繼承(一個類只能繼承一個抽象類)多實現(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)系(如 ShapeCircle、Rectangle)。
  • 需要控制成員的訪問權(quán)限(如 protected 方法供子類調(diào)用)。

優(yōu)先使用接口

  • 定義不相關(guān)類的共同行為(如 IMovable 可被 CarBird 實現(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)文章

  • Unity快速生成常用文件夾的方法

    Unity快速生成常用文件夾的方法

    這篇文章主要介紹了Unity快速生成常用文件夾的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C#圖表開發(fā)之Chart詳解

    C#圖表開發(fā)之Chart詳解

    C#中的Chart控件用于開發(fā)圖表功能,具有Series和ChartArea兩個重要屬性,Series屬性是SeriesCollection類型,包含多個Series對象,每個Series代表圖表中的一個數(shù)據(jù)系列,Series對象有一個Points屬性,用于存儲數(shù)據(jù)點,每個數(shù)據(jù)點是一個DataPoint對象
    2024-12-12
  • C#9.0中init訪問器的實現(xiàn)

    C#9.0中init訪問器的實現(xiàn)

    本文主要介紹了C#9.0中init訪問器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • C#中TextBox實現(xiàn)輸入提示功能的方法

    C#中TextBox實現(xiàn)輸入提示功能的方法

    這篇文章主要介紹了C#中TextBox實現(xiàn)輸入提示功能的方法,涉及C#中TextBox的相關(guān)操作技巧,需要的朋友可以參考下
    2015-06-06
  • C#獲取系統(tǒng)當前日期和時間的示例詳解

    C#獲取系統(tǒng)當前日期和時間的示例詳解

    這篇文章主要為大家詳細介紹了C#如何使用DateTime的Now靜態(tài)屬性動態(tài)獲得系統(tǒng)當前日期和時間,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下
    2024-01-01
  • C# ZIP生成代碼總出錯的原因和解決方法

    C# ZIP生成代碼總出錯的原因和解決方法

    本文講解C#生成ZIP文件的核心步驟與常見問題,包括使用MemoryStream作為虛擬快遞箱、ZipArchive壓縮管理、異步傳輸優(yōu)化、大文件處理技巧及動態(tài)文件夾結(jié)構(gòu)生成,同時解析文件打不開、體積異常等錯誤原因和解決方案,需要的朋友可以參考下
    2025-07-07
  • 詳解c# 接口IDisposable的用法

    詳解c# 接口IDisposable的用法

    這篇文章主要介紹了詳解c# 接口IDisposable的用法,幫助大家更好的理解和學習c#,感興趣的朋友可以了解下
    2020-10-10
  • C#簡單訪問SQLite數(shù)據(jù)庫的方法(安裝,連接,查詢等)

    C#簡單訪問SQLite數(shù)據(jù)庫的方法(安裝,連接,查詢等)

    這篇文章主要介紹了C#簡單訪問SQLite數(shù)據(jù)庫的方法,涉及SQLite數(shù)據(jù)庫的下載、安裝及使用C#連接、查詢SQLIte數(shù)據(jù)庫的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘三 鏈表

    C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘三 鏈表

    這節(jié)我們討論鏈表的基本操作,并且畫圖以證明,下屆中我們將討論雙向鏈表,環(huán)形鏈表 應用舉例
    2012-11-11
  • 利用C#實現(xiàn)獲取與監(jiān)控電腦系統(tǒng)信息

    利用C#實現(xiàn)獲取與監(jiān)控電腦系統(tǒng)信息

    在C#中,獲取與監(jiān)控電腦系統(tǒng)信息通??梢酝ㄟ^多種方式實現(xiàn),這篇文章主要為大家整理了幾種常見的方法及其示例代碼,希望對大家有所幫助
    2024-11-11

最新評論