利用实例巧妙区分“抽象方法”和“虚方法”!

举报
灰小猿 发表于 2021/05/26 16:00:12 2021/05/26
【摘要】 抽象方法是指定义在抽象类中的方法,需要在子类中被实现的方法。而虚方法是指可以被子类覆盖的方法,或者说是可以被重写的方法。 目录 什么是抽象方法和虚方法? 抽象方法和虚方法的区别 举例分析方法的不同 抽象方法 虚方法 Hello!我是灰小猿! 最近在开发中,get到了虚方法这个名词,由于当时是在抽象类中用到,并且抽象方法和虚方法的使用有那么一丝丝的相...

抽象方法是指定义在抽象类中的方法,需要在子类中被实现的方法。而虚方法是指可以被子类覆盖的方法,或者说是可以被重写的方法。

目录

什么是抽象方法和虚方法?

抽象方法和虚方法的区别

举例分析方法的不同

抽象方法

虚方法


Hello!我是灰小猿!

最近在开发中,get到了虚方法这个名词,由于当时是在抽象类中用到,并且抽象方法和虚方法的使用有那么一丝丝的相近,之前也有了解过虚方法,但是对其概念比较模糊,所以今天在这里记录一下抽象方法和虚方法的区别。

 

什么是抽象方法和虚方法?

通俗上来讲,抽象方法是指定义在抽象类中的方法,需要在子类中被实现的方法。

而虚方法是指可以被子类覆盖的方法,或者说是可以被重写的方法。

 

抽象方法和虚方法的区别

抽象方法:只有方法名,没有方法体,方法名前用abstract关键字定义,必须在抽象类中声明,子类必须重写并实现父类中的抽象方法。

虚方法:有方法名和方法体,方法名前用virtual关键字定义,并不是必须在抽象类中声明,可以在任何非密封类中声明,但是当子类继承了父类后,存在于父类中的虚方法可以被重写,也可以不被重写。

关于抽象类的深入了解,小伙伴可以移步至我的这篇文章“抽象类到底抽不抽象?实例对比一看便知!

 

举例分析方法的不同

下面举个栗子说明一个抽象方法和虚方法的不同用途,以下代码使用C#语言编写,Java等语言思路类似。

 

抽象方法

比如说有一个基类“动物类”,同时有两个子类“鸟类”和“鸡类”。这两个类都有公共和特有的属性和方法。

如鸡和鸟都会叫,但是叫声不同,

鸡叫:咯咯咯

鸟叫:叽叽叽

我们就可以在基类“动物类”中定义一个约束“鸟类”和“鸡类”的抽象方法“叫声”。让这两个类分别实现该方法。

抽象方法的实现代码如下:

定义抽象类“动物类”实现抽象方法


  
  1. //定义抽象类“动物类”
  2. abstract class Animal
  3. {
  4. //定义抽象方法“叫声”
  5. abstract public void cry();
  6. }

定义“鸟类”,并且继承自“动物类”,实现“动物类”中的抽象方法。


  
  1. //定义子类“鸟类”,并且继承自“动物类”
  2. class Fowl : Animal
  3. {
  4. //实现“动物类”中的抽象方法cry
  5. public override void cry()
  6. {
  7. Console.WriteLine("鸟叫:叽叽叽");
  8. }
  9. }

定义“鸡类”,并且继承自“动物类”,实现“动物类”中的抽象方法。


  
  1. //定义“鸡类”,并且继承自“动物类”
  2. class Chicken : Animal
  3. {
  4. //实现“动物类”中的抽象方法cry
  5. public override void cry()
  6. {
  7. Console.WriteLine("鸡叫:咯咯咯");
  8. }
  9. }

主类中分别调用“鸟类”和“鸡类”实现该叫声方法


  
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //新建一个对象对“鸟类”实例化
  6. Fowl fowl = new Fowl();
  7. //新建一个对象对“鸡类”实例化
  8. Chicken chicken = new Chicken();
  9. fowl.cry(); //实现“鸟类”中叫声方法
  10. chicken.cry(); //实现“鸡类”中叫声方法
  11. }
  12. }

运行结果:

 

虚方法

还有比如鸡和鸟都会飞,而且都是扇动翅膀飞行,但是鸟飞的很高,鸡飞的很低,这就是在飞行这个方法上,“鸡类”和“鸟类”既有公共特征也有不同特征,

那么就可以将飞行这个方法定义为虚方法,分别在“鸡类”和“鸟类”中重写该方法,但是会保留该方法中原有的公共特征“扇动翅膀”,添加自己特有的特征“飞行高度”。

虚方法的实现代码如下:

由于虚方法并不是必须在抽象类中声明,而是可以在任何非密封类中声明,所以将飞行这一动作声明在基类“动物类”中。


  
  1. //定义基类“动物类”
  2. class Animal
  3. {
  4. //定义抽象方法“叫声”
  5. public void fly()
  6. {
  7. Console.WriteLine("扇动翅膀飞行");
  8. }
  9. }

在“鸟类”中重写飞行方法,加入该类特有的特征:


  
  1. //定义子类“鸟类”,并且继承自“动物类”
  2. class Fowl : Animal
  3. {
  4. //重写“动物类”中的方法fly,并用bew关键字对基类中的fly方法进行隐藏
  5. public new void fly()
  6. {
  7. Console.WriteLine("扇动翅膀飞行");
  8. Console.WriteLine("鸟飞的很高");
  9. }
  10. }

在“鸡类”中重写飞行方法,加入该类特有的特征:


  
  1. //定义“鸡类”,并且继承自“动物类”
  2. class Chicken : Animal
  3. {
  4. //重写“动物类”中的方法fly,并用bew关键字对基类中的fly方法进行隐藏
  5. public new void fly()
  6. {
  7. Console.WriteLine("扇动翅膀飞行");
  8. Console.WriteLine("鸡飞的很低");
  9. }
  10. }

在主类中分别调用“鸟类”和“鸡类”实现该飞行方法:


  
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //新建一个对象对“鸟类”实例化
  6. Fowl fowl = new Fowl();
  7. //新建一个对象对“鸡类”实例化
  8. Chicken chicken = new Chicken();
  9. fowl.fly(); //实现“鸟类”中飞行方法
  10. chicken.fly(); //实现“鸡类”中飞行方法
  11. }
  12. }

运行结果:

觉得不错记得点赞关注哟!

大灰狼陪你一起进步!

 

文章来源: blog.csdn.net,作者:灰小猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_44985880/article/details/107189751

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。