簡單的說:
1.抽象類別和介面相近,區別在於,抽象類別中可以部分實現其成員。
2.抽象類別中至少有一個未實現的成員。
3.抽象類別不能執行個體化,它的衍生類別可以被執行個體化。
定義方法為:
| 代碼如下 |
複製代碼 |
以下為引用的內容: /// <summary> /// 定義抽象類別 /// </summary> abstract public class Animal { //定義靜態欄位 static protected int _id; //定義屬性 public abstract static int Id { get; set; } //定義方法 public abstract void Eat();
//定義索引器 public string this[int i] { get; set; } } /// <summary> /// 實現抽象類別 /// </summary> public class Dog: Animal { public static override int Id { get {return _id;} set {_id = value;} } public override void Eat() { Console.Write("Dog Eats.") } }
|
練習題題目:
要實現隨身碟、MP3播放器、移動硬碟三種移動存放裝置,要求電腦能通這三種裝置進行資料交換,並且以後可能會有新的第三方的移動存放裝置,所以電腦必須有擴充性,能與目前為止而以後可能會出現的存放裝置進行資料交換。各個存放裝置間讀、寫得實現方法不同,隨身碟和移動硬碟只有這兩個方法,MP3Player還有一個playMusic方法;
| 代碼如下 |
複製代碼 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Practices03 { class Program { static void Main(string[] args) { Computer myComputer = new Computer(); RSD myRSD = new USB(); myRSD.ReadDate(); myRSD.WriteDate(); Console.ReadKey(); } } /// <summary> /// RSD:移動存放裝置 /// </summary> abstract class RSD { public abstract void ReadDate(); public abstract void WriteDate(); } class USB:RSD { public override void ReadDate() { Console.WriteLine("ReadDate method for USB!"); } public override void WriteDate() { Console.WriteLine("WtiteDate method for USB!"); } } class MP3Player:RSD { public override void ReadDate() { Console.WriteLine("ReadDate method for MP3Player!"); } public override void WriteDate() { Console.WriteLine("WtiteDate method for MP3Player!"); } public virtual void PlayMusic() { Console.WriteLine("PlayMusic method for MP3Player!"); } } class MobileHDD:RSD { public override void ReadDate() { Console.WriteLine("ReadDate method for MobileHDD!"); } public override void WriteDate() { Console.WriteLine("WtiteDate method for MobileHDD!"); } } class Computer { public RSD RSD { get; set; } public void ReadDate() { RSD.ReadDate(); } public void WriteDate() { RSD.WriteDate(); } } } |
何時使用抽象類別
當需要一組相關組件來包含一組具有相同功能的方法,但同時要求在其他方法實現中具有靈活性時,可以使用抽象類別。當預料可能出現版本問題時,抽象類別也具有價值,因為基類比較靈活並易於被修改。有關詳細資料,請參見抽象類別與介面建議。
抽象類別與介面建議請參見
抽象類別 | 組件中的多態性 | MustInherit (Visual Basic) | abstract (C#)
選擇將功能設計為介面還是抽象類別(在 Visual Basic 中為 MustInherit 類)有時是一件困難的事。“抽象類別”是一種不能執行個體化而必須從中繼承的類。抽象類別可以完全實現,但更常見的是部分實現或者根本不實現,從而封裝繼承類的通用功能。有關詳細資料,請參見抽象類別。
相反,“介面”是完全抽象的成員集合,可以被看作是為操作定義合約。介面的實現完全留給開發人員去做。
介面和抽象類別對組件互動都很有用。如果一個方法要求一個參數形式的介面,則任何實現該介面的對象都可以用在該參數中。例如:
Visual Basic
Public Sub Spin (ByVal widget As IWidget)
End Sub
C#
public void Spin (IWidget widget)
{}
此方法可以接受任何將 IWidget 實現為小組件參數的對象,即使 IWidget 的實現可能相差很大。抽象類別也允許這種多態性,但須注意以下幾點:
類可能只是從一個基類繼承,所以如果要使用抽象類別為一組類提供多態性,這些類必須都是從那個類繼承的。
抽象類別還可能提供已實現的成員。因此,可以用抽象類別確保特定數量的相同功能,但不能用介面這樣做。
這裡是一些建議,協助您決定使用介面還是抽象類別為組件提供多態性。
如果預計要建立組件的多個版本,則建立抽象類別。抽象類別提供簡單易行的方法來控制組件版本。通過更新基類,所有繼承類都隨更改自動更新。另一方面,介面一旦建立就不能更改。如果需要介面的新版本,必須建立一個全新的介面。
如果建立的功能將在大範圍的全異對象間使用,則使用介面。抽象類別應主要用於關係密切的對象,而介面最適合為不相關的類提供通用功能。
如果要設計小而簡練的功能塊,則使用介面。如果要設計大的功能單元,則使用抽象類別。
如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類別。抽象類別允許部分實作類別,而介面不包含任何成員的實現。