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

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

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

目录

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

抽象方法和虚方法的区别

举例分析方法的不同

抽象方法

虚方法

Hello!我是灰小猿!

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

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

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

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

抽象方法和虚方法的区别

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

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

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

举例分析方法的不同

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

抽象方法

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

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

鸡叫:咯咯咯

鸟叫:叽叽叽

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

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

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

//定义抽象类“动物类”

abstract class Animal
{
    //定义抽象方法“叫声”
    abstract public void cry();
}

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

//定义子类“鸟类”,并且继承自“动物类”
class Fowl : Animal

{
    //实现“动物类”中的抽象方法cry
    public override void cry()
    {
        Console.WriteLine("鸟叫:叽叽叽");
    }      

}

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

//定义“鸡类”,并且继承自“动物类”

class Chicken : Animal
{
    //实现“动物类”中的抽象方法cry
    public override void cry()
    {
        Console.WriteLine("鸡叫:咯咯咯");
    }
}

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

class Program

{
    static void Main(string[] args)
    {           
        //新建一个对象对“鸟类”实例化
        Fowl fowl = new Fowl();
        //新建一个对象对“鸡类”实例化
        Chicken chicken = new Chicken();

        fowl.cry();     //实现“鸟类”中叫声方法
        chicken.cry();  //实现“鸡类”中叫声方法
    }
}

运行结果:

虚方法

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

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

虚方法的实现代码如下:

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

//定义基类“动物类”

class Animal
{
    //定义抽象方法“叫声”
    public void fly()
    {
        Console.WriteLine("扇动翅膀飞行");
    }
}

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

//定义子类“鸟类”,并且继承自“动物类”

class Fowl : Animal
{
    //重写“动物类”中的方法fly,并用bew关键字对基类中的fly方法进行隐藏
    public new void fly()
    {
        Console.WriteLine("扇动翅膀飞行");
        Console.WriteLine("鸟飞的很高");
    }    
}

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

//定义“鸡类”,并且继承自“动物类”

class Chicken : Animal
{
    //重写“动物类”中的方法fly,并用bew关键字对基类中的fly方法进行隐藏
    public new void fly()
    {
        Console.WriteLine("扇动翅膀飞行");
        Console.WriteLine("鸡飞的很低");
    }
}

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

class Program

{
    static void Main(string[] args)
    {         
        //新建一个对象对“鸟类”实例化
        Fowl fowl = new Fowl();
        //新建一个对象对“鸡类”实例化
        Chicken chicken = new Chicken();

        fowl.fly();     //实现“鸟类”中飞行方法
        chicken.fly();  //实现“鸡类”中飞行方法
    }
}

运行结果:

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

大灰狼陪你一起进步!

目录
相关文章
|
移动开发 开发框架 .NET
【机组】基于FPGA的32位算术逻辑运算单元的设计(EP2C5扩充选配类)
【机组】基于FPGA的32位算术逻辑运算单元的设计(EP2C5扩充选配类)
259 0
|
存储 关系型数据库 MySQL
MySQL主从同步如何保证数据一致性?
MySQL主从同步如何保证数据一致性?
936 0
MySQL主从同步如何保证数据一致性?
|
机器学习/深度学习 人工智能 自动驾驶
实战案例分析:AI在特定行业的深度应用
【7月更文第20天】随着人工智能技术的飞速发展,其在各行各业的应用日益广泛且深入,不仅推动了产业创新,也极大地提升了服务效率与质量。本文将聚焦于金融、教育、和交通三大领域,通过具体案例与技术解析,展现AI如何在这三个行业中发挥着革命性的作用。
2173 0
|
缓存 运维 监控
基于OneDNS实现上网安全防护和监控
DNS(域名系统)作为互联网的神经系统,是互联网基础设施中的关键环节。另一角度来说,DNS行为特征也是恶意软件的本质特征,思科研究报告指出,91.3%的恶意软件使用了DNS协议和远端进行通讯,实现远程的控制端通讯,窃取用户数据,伺机发起攻击等。而同时,DNS流量是企业安全管理被长期忽视的部分,网络管理员通常随便从互联网上搜索一个免费DNS,这类DNS一般只给个人用户服务,并不具备防护企业的能力。因此,企业需要一款专业的企业级DNS来覆盖安全防护盲区、提高安全能力。
846 0
基于OneDNS实现上网安全防护和监控
|
网络协议
复合循环指令编程及加工
复合循环指令编程及加工
复合循环指令编程及加工
|
Java JavaScript
高频词汇提取的Java实现
本文为原创,如需转载,请注明作者和出处,谢谢!     面对浩瀚的信息海洋,找到想要的资源有时真的是不容易。在大量文字中搜索高频词汇是信息搜索和数据压缩的共通课题。
1323 0
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
14天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~