對象有一個(gè)奇妙的機(jī)制就是多態(tài)消息。
剛看到這句話時(shí)就一個(gè)想法:什么鬼?后來才知道其實(shí)就是多態(tài)的應(yīng)用。
那么多態(tài)消息是什么呢?
消息是一個(gè)術(shù)語:
指一個(gè)對象調(diào)用另一個(gè)對象的成員函數(shù)(c++)或者方法(java)。
多態(tài)機(jī)制有兩種:
一種是靜態(tài)多態(tài),即編譯時(shí)就已經(jīng)確定,運(yùn)行時(shí)調(diào)用的是已經(jīng)確定的方法(消息),常見的就是重載:方法名相同,參數(shù)不同。
一種是動態(tài)多態(tài),即編譯時(shí)不確定調(diào)用哪個(gè)方法,一直延遲到運(yùn)行到那個(gè)地方才能確定,因此多態(tài)方法又叫延遲方法。
多態(tài)有兩種實(shí)現(xiàn)方式:
一種是子類繼承父類。
一種是類實(shí)現(xiàn)接口。
兩種方法的核心目的都是以一個(gè)消息(調(diào)用一個(gè)方法方法)來實(shí)現(xiàn)運(yùn)行時(shí)的不同效果,方式為:對父類方法的復(fù)寫或?qū)涌诜椒ǖ膶?shí)現(xiàn)。
因此總結(jié)出使用多態(tài)有一個(gè)法則:
聲明的總是父類型或者接口類型,創(chuàng)建的時(shí)實(shí)際類型。舉例來說用多態(tài)創(chuàng)建一個(gè)arraylist,就應(yīng)該用這樣的語句
List list = new ArrayList(),
而不是
ArrayList list = new ArrayList()。
定義方法參數(shù)也應(yīng)該優(yōu)先使用父類類型或接口類型,比如一個(gè)方法定義參數(shù)是list數(shù)組,那就應(yīng)該用List而不是ArrayList,這樣才符合多態(tài)機(jī)制。
為什么?因?yàn)檫@樣聲明最大的好處在于結(jié)構(gòu)的靈活性:假如某一天我認(rèn)為ArrayList的特性無法滿足我的需求,需要用LinkedList來代替它,那么只需要把對象創(chuàng)建的地方new ArrayList()改為new LinkedLIst()即可,其他代碼一概不動。不然可能就要改變這個(gè)函數(shù)的傳參或者重載這個(gè)函數(shù),將大大增加代碼量和結(jié)構(gòu)的臃腫。
所以反過來就可以得到多態(tài)的作用:
對結(jié)構(gòu)和設(shè)計(jì)的復(fù)用。定義功能和組件時(shí)定義接口,實(shí)現(xiàn)留在之后的流程中。