C#中abstract与virtual的用法

关于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();
        }

运行结果如下:

image

2.第二种情况

如果用virtual,Animal类则修改如下,注意虚方法要有方法体。

abstract class Animal
    {
        public virtual void Shout()
        {
            Console.WriteLine("动物叫!");
        }
    }

运行结果依旧:

image

在第一种情况下,由于子类必须要实现基类的抽象方法,所以如果把Cat类的Shout()方法去掉,程序编译会报错。

但是在第二种情况下,如果把Cat类的Shout()方法去掉,则客户端没有覆盖基类的Shout()方法,cat.Shout()会调用基类的Shou()方法。运行结果如下:

image

posted @ 2010-01-21 23:05  liming1019  阅读(1516)  评论(1编辑  收藏  举报