对象有一个奇妙的机制就是多态消息。
刚看到这句话时就一个想法:什么鬼?后来才知道其实就是多态的应用。
那么多态消息是什么呢?
消息是一个术语:
指一个对象调用另一个对象的成员函数(c++)或者方法(java)。
多态机制有两种:
一种是静态多态,即编译时就已经确定,运行时调用的是已经确定的方法(消息),常见的就是重载:方法名相同,参数不同。
一种是动态多态,即编译时不确定调用哪个方法,一直延迟到运行到那个地方才能确定,因此多态方法又叫延迟方法。
多态有两种实现方式:
一种是子类继承父类。
一种是类实现接口。
两种方法的核心目的都是以一个消息(调用一个方法方法)来实现运行时的不同效果,方式为:对父类方法的复写或对接口方法的实现。
因此总结出使用多态有一个法则:
声明的总是父类型或者接口类型,创建的时实际类型。举例来说用多态创建一个arraylist,就应该用这样的语句
List list = new ArrayList(),
而不是
ArrayList list = new ArrayList()。
定义方法参数也应该优先使用父类类型或接口类型,比如一个方法定义参数是list数组,那就应该用List而不是ArrayList,这样才符合多态机制。
为什么?因为这样声明最大的好处在于结构的灵活性:假如某一天我认为ArrayList的特性无法满足我的需求,需要用LinkedList来代替它,那么只需要把对象创建的地方new ArrayList()改为new LinkedLIst()即可,其他代码一概不动。不然可能就要改变这个函数的传参或者重载这个函数,将大大增加代码量和结构的臃肿。
所以反过来就可以得到多态的作用:
对结构和设计的复用。定义功能和组件时定义接口,实现留在之后的流程中。