当前位置:首页 » 网站技术 » C#

C#虚函数virtual详解(1)

...

一、OOP的目标

使用面向对象的开发过程就是在不断地抽象事物的过程,我们的目标就是抽象出一个高内聚、低偶合,易于维护和扩展的模型。

二、遇到的问题

但是在抽象过程中我们会发现很多事物的特征不清楚,或者很容易发生变动,怎么办呢?比如飞禽都有飞这个动作,但是对于不同的鸟类它的飞的动作方式是不同的,有的是滑行,有的要颤抖翅膀,虽然都是飞的行为,但具体实现却是千差万别,在我们抽象的模型中不可能把一个个飞的动作都考虑到,那么怎样为以后留下好的扩展,怎样来处理各个具体飞禽类千差万别的飞行动作呢?比如我现在又要实现一个类“鹤”,它也有飞禽的特征(比如飞这个行为),如何使我可以只用简单地继承 “飞禽”,而不去修改“飞禽”这个抽象模型现有的代码,从而达到方便地扩展系统呢?

三、解决上述问题的方法

面向对象的概念中引入了虚函数来解决这类问题。

使用虚函数就是在父类中把子类中共有的但却易于变化或者不清楚的特征抽取出来,作为子类需要去重新实现的操作(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 其它的飞禽());
}

继续阅读
C#3.0中使用扩展方法来扩展接口
C#读写Binary实例代码
C#排雷游戏(Mines)代码
C#常用正则表达式总结[荐]
C#关键字之:base、this
C#编程规范参考
C#中new关键字的用法
C#生成不重复的随机数
C#编写多线程应用程序简单示例
发表评论

昵称:
最新评论
456 发表于 2009-1-2 15:55:33
5555
456 发表于 2009-1-2 15:55:23
OK