- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1.virtual 虚方法 的作用就是 让子类 可以 重新 定义 父类 方法的实现(overload)
例如:
class A
{
public virtual string Print()
{
return 我是A类;
}
}
class B : A
{
}
class C : A
{
public overload string Print()
{
return 我是C类;
}
}
以上类B,类C都继承了类A;
当调用类B的Print方法时,返回值是:我是A类;
当调用类C的Print方法时,返回值是:我是C类; 一、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#种虚拟函数的的执行过程
在C++、Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然也不例外。
虚拟函数从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就
文档评论(0)