C#中的虚方法,抽象方法,抽象类以及接口

前言

众所周知,面向对象三大特点:封装、继承、多态。而今天我们将要学习的都是以多态为基础的,而什么是多态呢?举个不恰当的例子,比如你的对象,今天面对你是一副姿态,明天她给你戴绿帽子又是另一副模样(这个例子是从一个博主那看到的),你的对象还是同一个人,但是可以根据使用的对象来展现不一样的面貌,这,就是多态。简单来说:多态就是在继承的前提下,不同对象调用相同方法却表现出不同的行为。注:本次示例使用VS Code.

虚方法:virtual

虚方法存在于相对于需要实现多态的子类的父类当中,同时也是实现多态的最基本的方法。

具体语法:父类的方法,用virtual修饰,表示虚方法。继承它的子类,在内部用override进行重写。下面进行案例分析:

猫和狗都是动物,他们都会叫,但是叫声不一样。提取出相同的部分,即叫声,将叫声实现为多态。

新建父类:Animal,新建子类Cat、Dog,代码如下:



v2-999d71d228e5c26b007a186ad831bec7_b.jpg




v2-bda057843dae76e80f0d19dc06ec6a61_b.jpg



v2-4ecb27bc612e76e9a2812b9757770a94_b.jpg




v2-309094edfea753e931a7bdae7317cfe2_b.jpg


调用小猫重写的方法


v2-0d3b426b4115a6e5fdad3ae35ff58ec4_b.jpg


调用小狗重写的方法


抽象方法和抽象类

抽象方法和抽象类的关键字都是:abstract

如果父类的方法很抽象,而且没有具体的do(做什么)即方法体,必须要子类进行重写才有实际意义的话,这种情况就需要用抽象方法了。

父类、子类及输出:



v2-a040cf319e994fb0b566054e480ab411_b.jpg




v2-d9456e64f433adee8d857af9a7758883_b.jpg




v2-45c44006db4bf3974f35d2dde3ffc442_b.jpg



v2-0a77c70c539fee7f305fb61b463b7bbc_b.jpg


抽象方法,必须存在于抽象类当中。相反,抽象类中不一定全部是抽象方法。比如我们可以在里面写上普通方法,有实现的虚方法或者没有实现的虚方法都可以。前面我们讲的虚方法,假如子类需要完成多态的表现,而父类的方法实际上也有实际意义,那父类可以选择实现,等需要子类重写的时候去重写实现调用,父类的方法暂时没有实际意义,也可以不用具体实现。所以,父类的虚方法可以实现(有方法体),也可以不实现(没有方法体)。而抽象方法必须通过子类的重写来实现。

抽象类可以被实例化,但不能通过普通的实例化new,它只能通过父类的应用指向子类的实例来间接的实例化子类。

注意:抽象方法没有方法体,继承了抽象类的子类,必须实现父类的所有的抽象方法。

抽象类使用场景:

1.父类方法不知道如何去使用

2.父类没有默认实现,而且不需要实例化

总的来说:抽象方法和虚方法差不多,实现的功能都差不多。抽象方法必须要包含在抽象类当中,而抽象类中可以不全是抽象方法。抽象类保证了所有的抽象方法必须得到重写,而虚方法可以根据需要来选择是否进行重写。

接口:Interface

接口和抽象类差不多,区别在于,接口内包含的全部是未实现的方法。而且接口类和方法的关键词不需要再声明abstract,接口类的关键词,interface,一般定义接口名称,按照约定,我们会在名称前面加上一个I。例如下图的打印机接口。



v2-7d4c48bcbd2516c397c84708bfb230d7_b.jpg


里面有两个未实现的方法。下面定义一个惠普打印机实现类,继承自接口IPrinter



v2-99ea264b36bbfb2a4206bd3b3835ed2e_b.jpg


输出:


v2-b7c7de236f80eb0a6cc322769d858d7d_b.jpg


总结可以如下图:



v2-7d9a6ed280e1461942f7c1979d11b204_b.jpg
相关文章
相关标签/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。