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

简介:

 

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

目录

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

抽象方法和虚方法的区别

举例分析方法的不同

抽象方法

虚方法


Hello!我是灰小猿!

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

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

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

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

抽象方法和虚方法的区别

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

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

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

举例分析方法的不同

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

抽象方法

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

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

鸡叫:咯咯咯

鸟叫:叽叽叽

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

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

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

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

image.gif

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

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

image.gif

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

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

image.gif

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

class Program
    {
        static void Main(string[] args)
        {           
            //新建一个对象对“鸟类”实例化
            Fowl fowl = new Fowl();
            //新建一个对象对“鸡类”实例化
            Chicken chicken = new Chicken();
            fowl.cry();     //实现“鸟类”中叫声方法
            chicken.cry();  //实现“鸡类”中叫声方法
        }
    }

image.gif

运行结果:

image.gif编辑

虚方法

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

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

虚方法的实现代码如下:

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

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

image.gif

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

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

image.gif

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

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

image.gif

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

class Program
    {
        static void Main(string[] args)
        {         
            //新建一个对象对“鸟类”实例化
            Fowl fowl = new Fowl();
            //新建一个对象对“鸡类”实例化
            Chicken chicken = new Chicken();
            fowl.fly();     //实现“鸟类”中飞行方法
            chicken.fly();  //实现“鸡类”中飞行方法
        }
    }

image.gif

运行结果:

image.gif编辑

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

大灰狼陪你一起进步!

image.gif编辑

目录
相关文章
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
54 1
|
6月前
|
Java
Java方法继承、方法重载、方法覆盖总结
总之,继承实现类的层次结构,方法重载提供方法的多样性,方法覆盖实现多态性。这些概念是面向对象编程的核心,用于实现代码的结构、灵活性和可维护性。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
34 0
【C++要笑着学】多态 | 重写(覆盖) | 协变构多态 | 父虚子非虚也构多态 | final与override关键字(C++11) | 抽象类 | 纯虚函数 | 抽象类指针
本章我们继续讲解面向对象三大特性,上一章我们讲解了继承,本章我们讲解多态。从多态的概念一步步讲解,介绍构成多态的必要条件和两个例外。还会顺带讲解一下 C++11 更新的两个和多态有关系的关键字 final 和 override。上一章我们讲解了虚函数,本章会先补充纯虚函数的概念,然后再引入抽象类的概念。本章我们只学习C++多态的基础知识,至于多态的原理(VTBL、决议等)的难度相对较大,我们单独放到下一章去做专门讲解。
280 0
【C++要笑着学】多态 | 重写(覆盖) | 协变构多态 | 父虚子非虚也构多态 | final与override关键字(C++11) | 抽象类 | 纯虚函数 | 抽象类指针
|
编译器 C++
C++中继承与虚继承本质之优秀
C++中继承与虚继承本质之优秀
159 0
C++中继承与虚继承本质之优秀
|
设计模式 安全 Java
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
称为类 B 继承类 A 特点: B类的对象可以使用 A类的属性和方法 优点: 代码复用.重复相同的代码不用多次书写. 名词: 类A: 父类 基类 类B: 子类 派生类 2. 单继承和多层继承[理解] 单继承: 如果一个类只有一个父类,把这种继承关系称为单继承 多继承: 如果一个类有多个父类,把这种继承关系称为多继承 多层继承: C–> B --> A 3. 子类重写父类的同名方法[掌握] 重写: 子类定义和父类名字相同的方法. 为什么重写: 父类中的方法,不能满足子类对象的需求,所以
542 1
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
|
Java
抽象类和接口的区别(通俗易理解)
抽象类和接口的区别(通俗易理解)
519 0
|
Java C#
利用实例巧妙区分“抽象方法”和“虚方法”!
利用实例巧妙区分“抽象方法”和“虚方法”!
135 0
|
Java
Java面向对象——类定义及使用、方法的定义及使用
Java面向对象——类定义及使用、方法的定义及使用
200 0
|
存储 C#
艾伟:C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
1.C#类和接口的区别 接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念! 而类是负责功能的具体实现! 在类中也有抽象类的定义,抽象类与接口的区别在于: 抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
1300 0