11.5 抽象类及抽象方法
❑抽象类及抽象方法仅可以被继承,不能被实例化;
❑抽象方法不能包含方法体,并且抽象方法所在的类必须也声明为抽象类;
❑要声明抽象类及抽象方法,可以使用关键字abstract,关键字abstract置于关键字class的前面。
如代码清单11-10所示:
代码清单11-10 抽象类及抽象方法
abstract class Person
{
public abstract void Speak();
}
❑抽象方法没有实现,所以方法定义后面紧跟分号,而不是方法体;
❑抽象类的派生类必须实现所有的抽象方法;
❑当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。如代码清单11-11和图11-8所示:
代码清单11-11 覆写方法示例
1 using System;
2
3 namespace ProgrammingCSharp4
4{
5 class PolymorphismSample
6{
7 static void Main()
8{
9 Person p=new Pekingese();
10 Welcome(p);
11}
12
13 static void Welcome(Person person)
14{
15 person.Speak();
16}
17}
18
19 class Person
20{
21 public virtual void Speak()
22{
23 Console.WriteLine(“说话……”);
24}
25}
26
27 abstract class Chinese:Person
28{
29 public abstract override void Speak();
30}
31
32 class Pekingese:Chinese
33{
34 public override void Speak()
35{
36 Console.WriteLine(“说北京话……”);
37}
38}
39}
图 11-8 覆写方法示例
如图11-8所示,抽象类Chinese的抽象方法覆写了基类(Person)的虚方法Speak,而Chinese的Speak方法为抽象方法,因此并没有实现,而是将方法的实现留在派生类Pekingese中实现。
下面,我们将虚方法和抽象方法做个对比,如表11-1所示。