c#中的抽象類的特徵
抽象類具有以下特性:
· 抽象類不能實例化。
· 抽象類可以包含抽象方法和抽象訪問器。
· 不能用 sealed 修飾符修飾抽象類,因爲這兩個修飾符的含義是相反的。採用 sealed 修飾符的類無法繼承,而 abstract 修飾符要求對類進行繼承。
· 從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實際實現。[2]
2比較區別編輯
1. 抽象類不能直接實例化,並且對抽象類使用 new 運算符會導致編譯時錯誤。雖然一些變量和值在編譯時的類型可以是抽象的,但是這樣的變量和值必須或者爲 null,或者含有對非抽象類的實例的引用(此非抽象類是從抽象類派生的)。[3]
2. 允許(但不要求)抽象類包含抽象成員。[3]
抽象類表示該類中可能已經有一些方法的具體定義,但是接口就僅僅只能定義各個方法的界面(方法名,參數列表,返回類型),並不關心具體細節。
接口是引用類型的,和抽象類的相似之處有三點:
1. 不能實例化;
2. 包含未實現的方法聲明;
3. 派生類必須實現未實現的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員)。[4]
抽象類與接口緊密相關。然而接口又比抽象類更抽象,這主要體現在它們的差別上:
1. 類可以實現無限個接口,但僅能從一個抽象(或任何其他類型)類繼承,從抽象類派生的類仍可實現接口,從而得出接口是用來解決多重繼承問題的。[5]
2. 抽象類當中可以存在非抽象的方法,可接口不能,且它裏面的方法只是一個聲明必須用public來修飾沒有具體實現的方法。
3. 抽象類中的成員變量可以被不同的修飾符來修飾,可接口中的成員變量默認的都是靜態常量(static final)。
4. 抽象類是對象的抽象,然而接口是一種行爲規範。
抽象類裏面可以有非抽象方法但接口裏只能有抽象方法聲明方法的存在而不去實現它的類被叫做抽像類(abstract class),它用於要創建一個體現某些基本行爲的類,併爲該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽像類,並讓它指向具體子類的一個實例。不能有抽像構造函數或抽像靜態方法。Abstract 類的子類爲它們父類中的所有抽像方法提供實現,否則它們也是抽像類爲。取而代之,在子類中實現該方法。知道其行爲的其它類可以在類中實現這些方法。接口(interface)是抽像類的變體。在接口中,所有方法都是抽像的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽像的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行爲。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然後,它可以在實現了該接口的類的任何對像上調用接口的方法。由於有抽像類,它允許使用接口名作爲引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口
靜態類主要功能編輯
它們僅包含靜態成員。
它們不能被實例化。
它們是密封的。
它們不能包含實例構造函數。
因此創建靜態類與創建僅包含靜態成員和私有構造函數的類大致一樣。私有構造函數阻止類被實例化。
3優點編輯
使用靜態類的優點在於,編譯器能夠執行檢查以確保不致偶然地添加實例成員。編譯器將保證不會創建此類的實例。
靜態類是密封的,因此不可被繼承。靜態類不能包含構造函數,但仍可聲明靜態構造函數以分配初始值或設置某個靜態狀態。
4注意事項編輯
靜態類不能有實例構造器。
靜態類不能有任何實例成員。靜態類不能使用abstract或sealed修飾符。靜態類默認繼承自System.Object根類,不能顯式指定任何其他基類。
靜態類不能指定任何接口實現。
靜態類的成員不能有protected或protected internal訪問保護修飾符。