上一节我们提到了多态,那么多态的作用是什么呢?--把不同子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化--体现多态最好的例子就是virtual(虚方法),abstract(抽象类),interface的使用
virtual和abstrcat的区别:在本质上,这两个方法是没有区别的,都是实现多态的,都是实现了方法的重写,最主要的区别在于我们是否需要使用基类实例化的对象.
比如说 现在有一个Employee类作为基类,ProjectManager类继承自Employee,这个时候我们就需要使用虚方法来实现多态了,因为我们要使用Employee创建的对象,这些对象就是普通员工对象。
再比如说 现在有一个Person类作为基类,Student,Teacher 类继承Person,我们需要使用的是Student和Teacher创建的对象,根本不需要使用Person创建的对象,
所以在这里Person完全可以写成抽象类。
而接口和它们,存在了一些差异,首先接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员
因为接口不提供实现,所以我们必须在继承接口后对其进行实现
首先我们先来举个例子:喜鹊和老鹰都可以飞,这个飞的能力,我怎么来实现呢?我们可以在父类中添加一个飞的方法就好了
这个时候,如果我们想要往里面加一个企鹅呢?企鹅不会飞,你也许会说,这有什么,我们可以在会飞的鸟里面添加fly方法啊
对,这样是可以。功能完全可以实现,可是这样违背了面向对象啊开放封闭原则,下次我要在扩展一个鸟类比如猫头鹰(Owl),我还要去源代码中看下Fly的实现方式,然后在Owl中再次添加Fly方法,相同的功能,重复的代码,这样是不合理的,程序也不便于扩充
其次,如果我们还要添加一个飞机类(Plane),我继承Bird父类,合适吗?很显然,不合适,所以我们需要一种规则,那就是接口了,喜鹊,老鹰,飞机,我都实现这个接口,那就可以飞了,而企鹅不实现这个接口,他就不能飞
这就是接口的作用
可以看出用接口实现多态程序的扩展性得到了大大提升,以后不管是再扩展一个蝴蝶(Butterfly),还是鸟人(Birder)创建一个类,实现这个接口,在主函数中添加该对象就可以了。
也不需要查看源代码是如何实现的,体现了开放封闭原则