從前有一家IT公司,里面有很多人,每個人都有自己的年齡、身高、性別,等等。這些人在這家IT公司里從事着不同的職業,有負責接待的前台,有負責銷售的業務員,有負責招聘的HR,有負責掃地的清潔工,還有很多很多負責敲代碼的碼農。
___________________________________________________________________________
對象A:前台小妹/屬性:20歲,168cm,女/行為:吃飯、走路、說話、接待
對象B:業務員老王/屬性:30歲,175cm,男/行為:吃飯、走路、說話、銷售
對象C:人事小花/屬性:25歲,165cm,女/行為:吃飯、走路、說話、招聘
對象D:清潔工大媽/屬性:40歲,160cm,女/行為:吃飯、走路、說話、掃地
對象E:碼農阿磊/屬性:20歲,170cm,男/行為:吃飯、走路、說話、敲代碼
__________________________________________________________________________
封裝:
首先,屬性可用來描述同一類事物的特征,行為可描述一類事物可做的操作,封裝就是要把屬於同一類事物的共性(包括屬性與行為)歸到一個類中,以方便使用。比如人這個東西,可用下面的方式封裝:
人{
年齡(屬性一)
身高(屬性二)
性別(屬性三)
吃飯(行為之一)
走路(行為之二)
說話(行為之三)
}
繼承:
由於封裝,使得有共同特征的一類事物的所有描述信息都被歸於一類之中,但我們知道,這並不是萬能的,有些事物有共性,但還存在區別,比如碼農,簡單封裝起來如下:
碼農{
年齡(屬性一)
身高(屬性二)
性別(屬性三)
吃飯(行為之一)
走路(行為之二)
說話(行為之三)
敲代碼(行為之四)
}
上面對“碼農”的封裝,與對“人”的封裝基本上差不多,只是多了一個特征行為:敲代碼,碼農有與人一樣的共性,但我們不能說“人敲代碼”,也就是不能把敲代碼封裝到“人”之中去,敲代碼是碼農的特征行為之一。為了省事地封裝碼農(代碼的復用,這只是繼承存在的原因之一),可以讓碼農去繼承人,如:
碼農 extends 人{
敲代碼(行為之四)
}
這樣,我們就不用重新定義那些已經被“人”這一個類所封裝的那些屬性與行為了,而只需要使用繼承的方式,在人的基礎上拓展碼農專有的行為,即“敲代碼”即可把碼農描述出來:這樣的結果,即是碼農也同時擁有“人”之中所封裝的一切屬性與行為,還擁有自己的特征行為“敲代碼”。
多態:
多態的概念發展出來,是以封裝和繼承為基礎的(其實我覺得抽象也應該算是面向對象的大特征之一,要封裝,抽象是必須的)。
簡單理解一下多態,比如:
人這個類,封裝了很多人類共有的特性;
碼農是人的子類,繼承了人的屬性與行為,當然碼農有自己的特征行為,比如編程敲代碼;
前台是人的子類,繼承了人的屬性與行為,當然前台有自己的特征行為,比如接待收快遞;
現在,當我們需要去描述碼農與前台各自的行為的時候,我們可以分開來說“碼農在敲代碼”,“前台在接待”,但如果我們要站在抽象的角度,也就是從碼農與前台的父類“人”的角度,來同時描述他們各自的行為時,我們怎么描述?“人在敲代碼”?“人在接待”?這是不是怪怪的很不合適?不合適的問題就在於,對於行為主體,我們使用了抽象層次的東西“人”,而對於行為本身,我們卻使用了具體的東西“接待”與“敲代碼”。怎么解決呢? 那就需要解決抽象與具體的矛盾問題。
既然是站在抽象的角度來描述,那我們把行為抽象一下,不就能同時描述了嗎?比如“人在干活”(碼農在敲代碼與前台在接待都可以說成人在干活),這樣就解決了抽象層次與具體層次之間的矛盾。
到了這一步,我們可以把兩個描述:“碼農在干活”,“前台在干活” 兩者統一為“人在干活”,然后,我們可以在“碼農”的“干活”行為中去調用碼農自己的特征行為“敲代碼”,在“前台”的“干活”行為中去調用前台自己的特征行為“接待”,所以,當調用“人”去“干活”的時候,如果這個人是碼農,那他所做的事實際上就是“敲代碼”,如果這個人是前台,那他所做的事實際上就是“接待”。
也就是說在這里“人”是多態的,在不同的形態時,特征行為是不一樣的,這里的“人”,同時有兩種形態,一種是碼農形態,一種是前台形態,所對應的特征行為分別是“敲代碼”與“接待”。
完成上述的描述過程,其實就是多態機制的體現。
多態,就是站在抽象的層面上去實施一個統一的行為,到個體(具體)的層面上時,這個統一的行為會因為個體(具體)的形態特征而實施自己的特征行為。
比如,上班時間到了,老板喊一聲:“大家干活了!”於是所有人就各忙各的去了。如果老板不運用多態的方法,那就需要喊一句:“前台去接待了,業務員去銷售了,人事去招聘了,清潔工去掃地了,碼農去敲代碼了……”然后喊完估計就快下班了。
多態比起封裝與繼承來說要復雜很多,上面的描述很簡單,不用去死摳多態兩個字,其實只要明白:能站在抽象的角度去描述一件事,而針對這件抽象的事,對於每個個體(具體)又能找到其自身的行為去執行,這就是多態。