有時候,基類並不與具體的事物相聯系,而是只表達一種抽象的概念,用以為它的派生類提供一個公共的界面。為此,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!");
}
}