abstract 修飾符可以和類、方法、屬性、索引器及事件一起使用。在類聲明中使用 abstract 修飾符以指示某個類只能是其他類的基類。標記爲抽象或包含在抽象類中的成員必須通過從抽象類派生的類來實現。
在此例中,類 Square 必須提供 Area 的實現,因爲它派生自 ShapesClass:
abstract class ShapesClass
{
abstract public int Area();
}
class Square : ShapesClass
{
int x, y;
public override int Area()
{
return x * y;
}
}
備註
抽象類具有以下特性:
1、抽象類不能實例化。
2、抽象類可以包含抽象方法和抽象訪問器。
3、不能用 sealed(C# 參考)修飾符修改抽象類,這意味着抽象類不能被繼承。
4、從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實實現。
在方法或屬性聲明中使用 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”的實例。