定義
在C#中使用關鍵字 abstract 來定義抽象類和抽象方法。
不能初始化的類被叫做抽象類,它們只提供部分實現,但是另一個類可以繼承它並且能創建它們
的實例。
"一個包含一個或多個純虛函數的類叫抽象類,抽象類不能被實例化,進一步
一個抽象類只能通過接口和作為其它類的基類使用."- C++ Programming Language by Stroustrup Chapter13.2
抽象類能夠被用於類,方法,屬性,索引器和事件,使用abstract 在一個類聲明中表示該類傾向要作為其它類的基類
成員被標示成abstract,或被包含進一個抽象類,必須被其派生類實現。
abstract class ShapesClass { abstract public int Area(); } class Square : ShapesClass { int x, y; // Not providing an Area method results // in a compile-time error. public override int Area() { return x * y; } }
備注
抽象類具有以下特性:
1、抽象類不能實例化。
2、抽象類可以包含抽象方法和抽象訪問器。
3、不能用 sealed(C# 參考)修飾符修改抽象類,這意味着抽象類不能被繼承。
4、從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實實現。
5、抽象類可以是抽象方法和實例方法。
在方法或屬性聲明中使用 abstract 修飾符以指示方法或屬性不包含實現。
抽象方法具有以下特性:
1、抽象方法是隱式的虛方法。
2、只允許在抽象類中使用抽象方法聲明。
3、因為抽象方法聲明不提供實際的實現,所以沒有方法體;方法聲明只是以一個分號結束,並且在簽名后沒有大括號 ({ })。例如:
public abstract void MyMethod();
4、實現由一個重寫方法提供,此重寫方法是非抽象類的成員。
5、在抽象方法聲明中使用 static 或 virtual 修飾符是錯誤的。
除了在聲明和調用語法上不同外,抽象屬性的行為與抽象方法一樣。
1、在靜態屬性上使用 abstract 修飾符是錯誤的。
2、在派生類中,通過包括使用 override 修飾符的屬性聲明,可以重寫抽象的繼承屬性。
抽象類必須為所有接口成員提供實現。
實現接口的抽象類可以將接口方法映射到抽象方法上。例如:
interface I { void M(); } abstract class C: I { public abstract void M(); }
示例
在本例中,DerivedClass 類是從抽象類 BaseClass 派生的。抽象類包含一個抽象方法 AbstractMethod 和兩個抽象屬性 X 和 Y。
// abstract_keyword.cs // Abstract Classes using System; abstract class BaseClass // Abstract class { protected int _x = 100; protected int _y = 150; public abstract void AbstractMethod(); // Abstract method public abstract int X { get; } public abstract int Y { get; } } class DerivedClass : BaseClass { public override void AbstractMethod() { _x++; _y++; } public override int X // overriding property { get { return _x + 10; } } public override int Y // overriding property { get { return _y + 10; } } static void Main() { DerivedClass o = new DerivedClass(); o.AbstractMethod(); Console.WriteLine("x = {0}, y = {1}", o.X, o.Y); } }
輸出
x = 111, y = 161
注釋
在上面的示例中,如果試圖通過使用下面的語句將抽象類實例化:
BaseClass bc = new BaseClass(); // Error
將出現錯誤,指出編譯器無法創建抽象類“BaseClass”的實例。
在定義類的前面加上關鍵字abstract,那么這個類就是抽象類了,抽象類本身無法產生實例對象,而且抽象類包含了一個以上的抽象方法,這些方法只是提供函數名稱,並沒有定義如何具體實現,由繼承的派生類實現,派生類同時必須實現所有抽象類的方法,否則其本身將成為另外一個抽象類。需要我們注意的一點是,當派生類重寫抽象類的方法時,要使用override關鍵字來重寫抽象類所定義的方法。