抽象方法 由于抽象类本身表达的是抽象的概念, 因此类中的许多方法并不一定要有具体的实 现, 而只是留出一个接口来作为派生类重载的界面. 一个方法声明中如果加上 abstract 修饰符, 我们称该方法为抽象方法(abstract method). 如果一个方法被声明为抽象的, 那么该方法默认也是一个虚方法, 事实是, 抽象方 法是一个新的虚方法, 他不提供具体的方法实现代码, 我们知道, 非虚的派生类要求通过重 载为继承的虚方法提供自己的实现, 而抽象方法则不包含具体的实现内容, 所以方法声明 的执行体中只有一个分号 ";" . 只能在抽象类中声明抽象方法, 对抽象方法, 不能在使用 static 或 virtual 修饰符, 而且方法不能有任何可执行代码, 只需要给出方法的原型就可以了. using System; abstract class Vehicle { public int wheels; public int weight; public Vehicle(){} public Vehicle(int wheels,int weight) { this.wheels=wheels; this.weight=weight; } public abstract void Speak(); } class Car : Vehicle { public int passengers; public Car(int wheels,int weight,int passengers):base(wheels,weight) { this.wheels=wheels; this.weight=weight; this.passengers=passengers; } public override void Speak() { Console.WriteLine("the car Di-Di"); } } class Truck : Vehicle { public int load; public Truck(int wheels,int weight,int load):base(wheels,weight) { this.wheels=wheels; this.weight=weight; this.load=load; } public override void Speak() { Console.WriteLine("the truck Ba-Ba"); } } class Program { static void Main() { Car c=new Car(4,3,5); c.Speak(); Truck t=new Truck(10,5,50); t.Speak(); } } 抽象方法在派生类中不能使用 base 关键字来进行访问, 例如,下面的代码在编译时会出错 abstract 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() 并提供自己的实现. |