由于抽象类本身表达的是抽象的概念,因此类中的许多方法并不一定要有具体的实现,而只是留出一个接口来作为派生类重载的界面。举一个简单的例子,“图形”这个类是抽象的,它的成员方法“计算图形面积”也就没有实际的意义。面积只对“图形”的派生类比如“圆”、“三角形”这些非抽象的概念才有效,那么我们就可以把基类“图形”的成员方法“计算面积”声明为抽象的,具体的实现交给派生类通过重载来实现。
一个方法声明中如果加上abstract修饰符,我们称该方法为抽象方法(abstract method)。
如果一个方法被声明也是抽象的,那么该方法默认也是一个虚方法。事实上,抽象方法是一个新的虚方法,它不提供具体的方法实现代码。我们知道,非虚的派生类要求通过重载为继承的虚方法提供自己的实现,而抽象方法则不包含具体的实现内容,所以方法声明的执行体中只有一个分号“;”。
只能在抽象类中声明抽象方法。对抽象方法,不能再使用static或virtual修饰符,而且方法不能有任何可执行代码,哪怕只是一对大括号中间加一个分号“{;}”都不允许出现,只需要给出方法的原型就可以了。
“交通工具”的“鸣笛”这个方法实际上是没有什么意义的,接下来我们利用抽象方法的概念继续改写汽车类的例子:
程序清单14-6:
using System; abstruct class Vehicle //定义汽车类 { public int wheels; //公有成员:轮子个数 protected float weight; //保护成员:重量 public Vehicle(int w,float g){ wheels=w; weight=g; } public abstract void Speak(); }; class Car:Vehicle //定义轿车类 { int passenger; //私有成员:乘客数 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!"); } }
还要注意,抽象方法在派生类中不能使用base关键字来进行访问。例如,下面的代码在编译时会发生错误:
class A
{
public abstract void F();
}
class B:A
{
public override void F(){
base.F(); //错误,base.F是抽象方法
}
}
我们还可以利用抽象方法来重载基类的虚方法,这时基类中虚方法的执行代码就被“拦截”了。下面的例子说明了这一点:
class A { public virtual void F(){ Console.WriteLine("A.F"); } } abstract class B:A { public abstract override void F(); } class C:B { public override void F(){ Console.WriteLine("C.F"); } }
类A声明了一个虚方法F,派生类B使用抽象方法重载了F,这样B的派生类C就可以重载F并提供自己的实现。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, 三角形面积计算
, 方法
, 抽象
, public
, 一个
成员
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。