有時候,基類並不與具體的事物相聯系,而是只表達一種抽象的概念,用以為它的派生類提供一個公共的界面。為此,C#中引入了抽象類(abstract class)的概念。
注意:C++程序員在這裡最容易犯錯誤。C++中沒有對抽象類進行直接聲明的方法,而認為只要在類中定義了純虛函數,這個類就是一個抽象類。純虛函數的概念比較晦澀,直觀上不容易為人們接受和掌握,因此C#拋棄了這一概念。
抽象類使用abstract修飾符,對抽象類的使用有以下幾點規定:
●抽象類只能作為其它類的基類,它不能直接被實例化,而且對抽象類不能使用new操作符。抽象類如果含有抽象的變量或值,則它們要麼是null類型,要麼包含了對非抽象類的實例的引用。
●抽象類允許包含抽象成員,雖然這不是必須的。
●抽象類不能同時又是密封的。
如果一個非抽象類從抽象類中派生,則其必須通過重載來實現所有繼承而來的抽象成員,請看下面的示例:
abstruct class A
{
public abstruct void F();
}
abstract class B:a
{
public void G(){}
}
class C:B
{
public override void F(){
//F的具體實現代碼
}
}
抽象類A提供了一個抽象方法F。類B從抽象類A中繼承,並且又提供了一個方法G;因為B中並沒有包含對F的實現,所以B也必須是抽象類。類C是從類B中繼承,類中重載了抽象方法F,並且提供了對F的具體實現,則類C允許是非抽象的。
讓我們繼承研究汽車類的例子。我們從“交通工具”這個角度來理解Vehicle類的話,它應該表達一種抽象的概念,我們可以把它定義為抽象類。由轎車類Car和卡車類Truck來繼承這個抽象類,它們作為可以實例化的類。
程序清單14-5:
using System; abstract class Vehicle //定義汽車類 { public int wheels; //公有成員:輪子個數 protected float weight; //保護成員:重量 public Vehicle(int w,float g){ wheels=w; weight=g; } public virtual void Speak(){ Console.WriteLine("the w vehicle is speaking!"); } }; class Car:Vehicle //定義轎車類 { int passengers; //私有成員:乘客數 public Car(int w,float g,int p):base(w,g) { wheels=w; weight=g; passengers=p; } public override void Speak(){ Console.WriteLine("The car is speaking:Di-di!"); } } class Truck:Vehicle //定義卡車類 { int passengers; //私有成員:乘客數 float load; //私有成員:載重量 public Truck(int w,float g,int p,float l):base(w,g) { wheels=w; weight=g; passengers=p; load=l; } public override void Speak(){ Console.WriteLine("The truck is speaking:Ba-ba!"); } }