抽象类
有时候, 基类并不与具体的事物相联系, 而只是表达一种抽象的概念, 用以 为他的派生类提供一个公共的界面, 为此 , C#中引入了抽象类 (abstract class) 的概念.
抽象类使用 abstract 修饰符, 对抽象类的使用有以下几点规定:
• 抽象类只能作为其他类的基类, 他不能被实例化, 而且对抽象类不能使用 new 操作符, 抽象类如果含有抽象的变量或值, 则他们要么是 null 类型, 要么包含了对非抽象类的实例的引用.
• 抽象类允许包含抽象成员, 虽然这不是必须的.
• 抽象类不能同时又是密封的.
如果一个非抽象类从抽象类中派生, 则必须通过重载来实现所有继承而来的抽象成员.
abstract class A
{
public abstract 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 允许是非抽象的.
抽象方法
由于抽象类本身表达的是抽象的概念, 因此类中的许多方法并不一定要有具体的实 现, 而只是留出一个接口来作为派生类重载的界面.
一个方法声明中如果加上 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() 并提供自己的实现.
|