面向对象多态的实现(抽象类Abstract和接口Interface的用法区别)
到目前为止,还没有统一的面向对象的定义,但对于面向对象的特征早已有统一的认识:
继承、多态和封装。
在这里只讨论关于多态的一些实现问题。多态性,这个面向对象编程领域的核心概念,本身的内容博大精深,要以一文说清楚实在是不太可能。加之作者本人也还在不断学习中,水平有限。因此本文只能描一下多态的轮廓,使读者能够了解个大概。如果有描的不准的地方,欢迎指出。
==================================================================
什么是多态?(Polymorphisn)
按字面的意思就是“多种形态”。引用一下Charlie Calverts的对多态的描述,多态性就是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。
要解释清楚这个问题,引用一下一个经典的例子:游戏鸭子(具体的以及不清,大概其介绍)
在这个游戏中,玩家以鸭子的身份出现,有橡皮鸭子、木鸭子、真实的鸭子。三个鸭子都会游泳,而橡皮鸭子和真实的鸭子都会叫,只是叫声不一样,橡皮鸭子“唧唧”叫,真实地鸭子“嘎嘎”叫,木鸭子不会叫。用面向对象的设计方法去实现,首先,要从这些个角色中抽象出他们的共性,也就是基类:鸭子。如图:
这个由基类鸭子到木鸭子、橡皮鸭子还有真实的鸭子的过程就是多态的实现。
在面向对象语言中,C++中的多态是通过虚方法来实现的,而Java 和C#,对于多态的实现有很多种方法;可以用抽象类,可以用接口,也可以用需方法,只要实现多态的定义就行了。下面就以上面对的例子,按我的理解说一下。
1、 抽象(Abstract)
抽象,可以是方法级的,也可以使类级的。
在上面的例子中,如果不知道到底有哪些子类鸭子,子类鸭子都会叫,而且不知道他们叫得方式到底是什么样,同时,确定所有的继承的鸭子都回游泳,那么就可以在基类鸭子的叫得特性用abstract来实现。
2、 接口(Interface)
在上面的例子中,如果木鸭子、橡皮鸭子和真实的鸭子都只会游泳,那么可以用interface来实现,将鸭子的基类修改只包含游泳特性。或者,木头鸭子也会叫,只不过没声音,
而真实的鸭子不会飞(没有飞这个特性)那么也可以用接口(将木鸭子也添加叫的特性)。
3、 虚方法(Virtual)
如果,我想在鸭子的基类里面也定义叫这么个特性,而对于继承他的子类如果没有需要不改变叫得动作,那么就可以在基类中的叫特性用virtual来实现,而在橡皮鸭子和真实鸭子子类中的叫用override实现唧唧叫和嘎嘎叫。