C# 虚函数

转自:http://www.cnblogs.com/smhy8187/articles/1686815.html

使用虚函数就是在父类中把子类中共有的但却易于变化或者不清楚的特征抽取出来,作为子类需要去重新实现的操作(override),我们可以称之做“热点”。而虚拟函数也是OOP中实现多态的关键之一。

例子(C#):

class 飞禽

{ 

        public string wing;             // 翅膀

        public string feather;          // 羽毛  

        ……                            // 其它属性和行为  

        public virtual bool Fly()       // 利用关键字virtual来定义为虚拟函数,这是一个热点

        {

                // 空下来让子类去实现

        }

}

 

class 麻雀 : 飞禽                       // 麻雀从飞禽继承而来

{

        ……    // 定义麻雀自己特有的属性和行为

        public override bool Fly()      // 利用关键字override重载飞翔动作,实现自己的飞翔

        {

                ……    // 实现麻雀飞的动作

        }

}

 

class  鹤 : 飞禽                        // 鹤从飞禽继承而来

{

        ……    // 定义鹤自己的特有的属性和行为

        public override bool Fly()      // 利用关键字override重载实现鹤的飞翔

        {

                ……    // 实现鹤飞的动作

        }

}

这样我们只需要在抽象模型“飞禽”里定义Fly()这个行为,表示所有由此“飞禽”派生出去的子类都会有Fly()这个行为,而至于Fly()到底具体是怎么实现的,那么就由具体的子类去实现就好了,不会再影响“飞禽”这个抽象模型了。

 

比如现在我们要做一个飞禽射击训练的系统,我们就可以这样来使用上面定义的类:

// 如何来使用虚拟函数,这里同时也是一个多态的例子.

// 定义一个射击飞禽的方法

// 注意这里申明传入一个“飞禽”类作为参数,而不是某个具体的“鸟类”。好处就是以后不管再出现多少

// 种鸟类,只要是从飞禽继承下来的,都照打不误:)(多态的方式)

void ShootBird(飞禽 bird) 

{

        // 当鸟在飞就开始射击

        if(bird.Fly())

        {

                ……    // 射击动作

        }

}

 

static void main()

{

        / /打麻雀

        ShootBird(new 麻雀());

        // 打鹤

        ShootBird(new 鹤());    

        // 都是打鸟的过程,我只要实现了具体某个鸟类(从“飞禽”派生而来)的定义,就可以对它

        // 进行射击,而不用去修改ShootBird函数和飞禽基类

        ShootBird(new 其它的飞禽());      

}
原文地址:https://www.cnblogs.com/jingsheng99/p/4104108.html