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