关于C#中的abstract与virtual的用法一直迷糊。于是自己动手写一写试试。
1.第一种情况
1 |
//抽象动物类,声明抽象方法Shout(),注意抽象方法没有方法体 |
2 |
abstract class Animal |
3 |
{ |
4 |
public abstract void Shout(); |
5 |
} |
01 |
// 猫类,继承动物类,覆盖抽象Shout()方法 |
02 |
class Cat:Animal |
03 |
{ |
04 |
public Cat() |
05 |
{ |
06 |
} |
07 |
08 |
public override void Shout() |
09 |
{ |
10 |
Console.WriteLine( "喵喵!" ); |
11 |
} |
12 |
} |
01 |
// 狗类,继承动物类,覆盖抽象Shout()方法 |
02 |
class Dog:Animal |
03 |
{ |
04 |
public Dog() |
05 |
{ |
06 |
} |
07 |
08 |
public override void Shout() |
09 |
{ |
10 |
Console.WriteLine( "汪汪!" ); |
11 |
} |
12 |
} |
1 |
// 客户程序调用 |
2 |
static void Main( string [] args) |
3 |
{ |
4 |
Animal cat = new Cat(); |
5 |
cat.Shout(); |
6 |
Animal dog = new Dog(); |
7 |
dog.Shout(); |
8 |
Console.ReadKey(); |
9 |
} |
运行结果如下:
2.第二种情况
如果用virtual,Animal类则修改如下,注意虚方法要有方法体。
1 |
abstract class Animal |
2 |
{ |
3 |
public virtual void Shout() |
4 |
{ |
5 |
Console.WriteLine( "动物叫!" ); |
6 |
} |
7 |
} |
运行结果依旧:
在第一种情况下,由于子类必须要实现基类的抽象方法,所以如果把Cat类的Shout()方法去掉,程序编译会报错。
但是在第二种情况下,如果把Cat类的Shout()方法去掉,则客户端没有覆盖基类的Shout()方法,cat.Shout()会调用基类的Shou()方法。运行结果如下: