1. 程式人生 > >C#基礎 類、結構、抽象類、接口的相關概念

C#基礎 類、結構、抽象類、接口的相關概念

索引器 設計模式的 小數據 自定義 引用 equals 執行 派生 trac

先來簡單說一下他們各自的含義是什麽:

  1. 類(class):
    類類型是由字段數據(成員變量)和操作字段數據的成員(屬性、方法、
    構造函數、事件等)所構成的自定義類型。其中字段數據表示類實例(對象)的 狀態。
    2.結構(struct):
    C#中結構類型和類類型在語法上非常相似,他們都是一種數據結構,都可
    以 包括數據成員和方法成員。
    3.抽象類:
    ①:抽象類是特殊的類,只是不能被實例化;
    ②:除此以外,具有類的其他特性;
    ③:重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。
    ④:另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。

    4.接口:
    接口是引用類型,類似於類,和抽象類的相似之處有三點:
    ①:不能實例化;
    ②:包含未實現的方法聲明;
    ③:派生類必須實現未實現的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);
    另外,接口特性如下:
    接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且
    這些成員都被定義為公有的。除此之外,不能包含任何其他成員,
    例如:常量、域、構造函數、析構函數、靜態成員。
    一個類可以直接繼承多個接口,但只能直接繼承一個類。
    5.類與結構的區別:
    ①:類是引用類型,它在堆(heap)中分配空間,棧中保存的只是引用。
    結構是值類型,它在棧(Stack)中分配空間。
    ②:類對象通常用來傳遞大數據,而結構對象則用來傳遞小數據。
    ③:類可以被繼承,而結構則不支持。
    ④:結構對象不能像類對象一樣賦值為null。
    ⑤:結構不能像類一樣定義析構器。
    ⑥:結構不能像類一樣定義為抽象的。
    ⑦:在結構中不能重寫方法,除非是object類型的如下方法:
    Equals()
    GetHashCode()
    GetType()
    ToString()
    若要讓結構具有多態特性,可以讓其實現接口。
    ⑧:在類中定義的事件是線程安全的,而結構則不是。
    ⑨:結構總是具有一個默認的公共無參構造函數,但卻不能像類一樣
    定義私有的無參構造函數(結構也不能再定義公共的無參構造函數,
    這與類不相同)。
    ⑩:類中的靜態構造函數會被調用,而結構卻不能。因此在結構中
    定義的靜態構造函數,雖然可以編譯通過,但卻沒有價值。
    11、結構不能像類一樣定義volatile字段。volatile字段主要用於並發
    ,它相當於方法體的lock。
    12、可以對結構類型使用sizeof,對類則不行。
    13、類的字段會被自動初始化為0/false/null,而結構則不能。
    14、在結構中不能直接對字段初始化,而類則可以。
    15、結構和類對於System.Object.Equals()方法的體現是不相同的。
    6.類與抽象類:
    ①:都可以被繼承 ;
    ②:抽象類不能被實例化,只是用來繼承的。普通類可以實例化 ;
    ③:抽象方法只有含方法聲明而沒有方法體且必須包含在抽象類裏面 ;
    ④:子類繼承抽象類必須實現抽象類中的抽象方法除非子類也是抽象類
    ⑤:抽象類中可以包含抽象方法也可以包含實例方法;
    7.接口與類的區別:
    ①:接口類似於類,但接口的成員都沒有執行方式,它只是方法、屬性、
    事件和索引符的組合而已,並且也只能包含這四種成員;類除了這四種
    成員之外還可以別的成員(如字段)。
    ②:不能實例化一個接口,接口只包括成員的簽名;而類可以實例化
    (abstract類除外)。
    ③:接口沒有構造函數,類有構造函數。
    ④:接口不能進行運算符的重載,類可以進行運算符重載。
    ⑤:接口的成員沒有任何修飾符,其成員總是公共的,而類的成員則可以
    有修飾符(如:虛擬或者靜態)。
    ⑥:派生於接口的類必須實現接口中所有成員的執行方式,而從類派生則不然。
    那麽為什麽還要有接口呢?
    主要原因是它是一種有效的契約。
    類有一些成員,不考慮把這些成員組合在一起,類只是一個擁有各種
    方法、字段和屬性的列表,但為了能以某種方式使用類,必須知道類
    能執行那些功能,具體的操作就是聲明執行一個或多個接口的類,
    類執行接口的方式是從接口中派生,再提供這個接口中定義的所有
    成員的執行方式。
    8.抽象類和接口之間的異同
    相同點:
    ①:都可以被繼承
    ②:都可以有方法的聲明
    ③:都不可以被實例化
    ④:子類必須實現基類的方法除非子類是抽象類

    不同點:
    ①:抽象類屬於多繼承,接口屬於單繼承
    ②:抽象類可以包含實例方法而接口不能
    ③:接口支持回調抽象類不能
    ④:子類實現抽象基類方法必須用override關鍵字而實現接口方法則
    不用override關鍵字
    ⑤:接口是一組行為規範,抽象類是一個不完全的類,著重於族的概念
    ⑥:接口可以作用於值類型和引用類型,抽象類只能作用於引用類型
    (例如:Struct只能繼承接口)
    ⑦:接口多定義對象的行為,抽象類多定義對象的屬性。
    ⑧:如果要設計小而簡練的功能塊,則使用接口,如果要設計大的功能單元,則使用抽象類
    ⑨:接口對應是面向對象編程思想的重要原則:面向接口編程
    ⑩:抽象類對應則是設計模式的的精髓:面相抽象編程

C#基礎 類、結構、抽象類、接口的相關概念