标签:
有时候,基类并不与具体的事物相联系,而是只表达一种抽象的概念,用以为它的派生类提供一个公共的界面。为此,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!");
}
}
C# 抽象类
标签:
原文地址:http://www.cnblogs.com/zcf09/p/4479546.html