前言
众所周知,面向对象三大特点:封装、继承、多态。而今天我们将要学习的都是以多态为基础的,而什么是多态呢?举个不恰当的例子,比如你的对象,今天面对你是一副姿态,明天她给你戴绿帽子又是另一副模样(这个例子是从一个博主那看到的),你的对象还是同一个人,但是可以根据使用的对象来展现不一样的面貌,这,就是多态。简单来说:多态就是在继承的前提下,不同对象调用相同方法却表现出不同的行为。注:本次示例使用VS Code.
虚方法:virtual
虚方法存在于相对于需要实现多态的子类的父类当中,同时也是实现多态的最基本的方法。
具体语法:父类的方法,用virtual修饰,表示虚方法。继承它的子类,在内部用override进行重写。下面进行案例分析:
猫和狗都是动物,他们都会叫,但是叫声不一样。提取出相同的部分,即叫声,将叫声实现为多态。
新建父类:Animal,新建子类Cat、Dog,代码如下:





抽象方法和抽象类
抽象方法和抽象类的关键字都是:abstract
如果父类的方法很抽象,而且没有具体的do(做什么)即方法体,必须要子类进行重写才有实际意义的话,这种情况就需要用抽象方法了。
父类、子类及输出:




抽象方法,必须存在于抽象类当中。相反,抽象类中不一定全部是抽象方法。比如我们可以在里面写上普通方法,有实现的虚方法或者没有实现的虚方法都可以。前面我们讲的虚方法,假如子类需要完成多态的表现,而父类的方法实际上也有实际意义,那父类可以选择实现,等需要子类重写的时候去重写实现调用,父类的方法暂时没有实际意义,也可以不用具体实现。所以,父类的虚方法可以实现(有方法体),也可以不实现(没有方法体)。而抽象方法必须通过子类的重写来实现。
抽象类可以被实例化,但不能通过普通的实例化new,它只能通过父类的应用指向子类的实例来间接的实例化子类。
注意:抽象方法没有方法体,继承了抽象类的子类,必须实现父类的所有的抽象方法。
抽象类使用场景:
1.父类方法不知道如何去使用
2.父类没有默认实现,而且不需要实例化
总的来说:抽象方法和虚方法差不多,实现的功能都差不多。抽象方法必须要包含在抽象类当中,而抽象类中可以不全是抽象方法。抽象类保证了所有的抽象方法必须得到重写,而虚方法可以根据需要来选择是否进行重写。
接口:Interface
接口和抽象类差不多,区别在于,接口内包含的全部是未实现的方法。而且接口类和方法的关键词不需要再声明abstract,接口类的关键词,interface,一般定义接口名称,按照约定,我们会在名称前面加上一个I。例如下图的打印机接口。

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

输出:

总结可以如下图:

网友评论