Welcome

首页 / 软件开发 / C# / C#的抽象类

C#的抽象类2007-09-28 本站 有时候,基类并不与具体的事物相联系,而是只表达一种抽象的概念,用以为它的派生类提供一个公共的界面。为此,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!");}}