對象有一個奇妙的機制就是多態(tài)消息。
剛看到這句話時就一個想法:什么鬼惊窖?后來才知道其實就是多態(tài)的應用览徒。
那么多態(tài)消息是什么呢?
消息是一個術語:
指一個對象調用另一個對象的成員函數(c++)或者方法(java)苫拍。
多態(tài)機制有兩種:
一種是靜態(tài)多態(tài),即編譯時就已經確定旺隙,運行時調用的是已經確定的方法(消息)绒极,常見的就是重載:方法名相同,參數不同蔬捷。
一種是動態(tài)多態(tài)垄提,即編譯時不確定調用哪個方法,一直延遲到運行到那個地方才能確定周拐,因此多態(tài)方法又叫延遲方法铡俐。
多態(tài)有兩種實現(xiàn)方式:
一種是子類繼承父類。
一種是類實現(xiàn)接口妥粟。
兩種方法的核心目的都是以一個消息(調用一個方法方法)來實現(xiàn)運行時的不同效果审丘,方式為:對父類方法的復寫或對接口方法的實現(xiàn)。
因此總結出使用多態(tài)有一個法則:
聲明的總是父類型或者接口類型勾给,創(chuàng)建的時實際類型滩报。舉例來說用多態(tài)創(chuàng)建一個arraylist,就應該用這樣的語句
List list = new ArrayList()播急,
而不是
ArrayList list = new ArrayList()脓钾。
定義方法參數也應該優(yōu)先使用父類類型或接口類型,比如一個方法定義參數是list數組桩警,那就應該用List而不是ArrayList可训,這樣才符合多態(tài)機制。
為什么捶枢?因為這樣聲明最大的好處在于結構的靈活性:假如某一天我認為ArrayList的特性無法滿足我的需求沉噩,需要用LinkedList來代替它,那么只需要把對象創(chuàng)建的地方new ArrayList()改為new LinkedLIst()即可柱蟀,其他代碼一概不動川蒙。不然可能就要改變這個函數的傳參或者重載這個函數,將大大增加代碼量和結構的臃腫长已。
所以反過來就可以得到多態(tài)的作用:
對結構和設計的復用畜眨。定義功能和組件時定義接口,實現(xiàn)留在之后的流程中术瓮。