前幾天看了一位同志的博客,寫的是關于他自己去支付寶面試的經歷。過程大體是這樣的:問答的時候,前面部分,作者都應答如流,說起自己經驗如何之豐富,最后面試官問了作者一個問題:請簡述多態的概念和作用。結果這位作者竟然說這么基礎的問題還真不記得了,于是,面試失敗。
其實多態,是個很基礎的,也非常重要的概念,作為程序開發者,這些基礎的概念必須非常牢固,在開發的過程中,才能得心應手。
同一操作作用于不同的對象,可以有不同的解釋,產生不同的執行結果,這就是多態性。舉個通俗的例子:摩托車和汽車都是車子的派生類,如果我在另一個類中需要調用車子的剎車方法,那么我只需要把車子的對象傳參數進去,然后調用“剎車()”方法即可。而摩托車和汽車的剎車的方法實現不同,雖然都叫“剎車”,但一個是手抓,一個是腳踩。但我們調用的時候不需要知道具體的實現,只管根據名稱調用即可,具體則根據示例的不同,而有不同的剎車方法的實現。
多態分為兩種:編譯時的多態,和運行時的多態
編譯時的多態:是通過重載來實現的。重載,即方法名稱相同,而參數的類型不同,或者參數的個數不同。最典型的重載是我們常用的“message”類下面的方法“show()”,一個參數代表彈出的信息內容,第二個參數代表彈窗標題,等等。
運行時的多態:通過虛成員的方式實現。在繼承關系里面,子類會繼承父類所有的屬性,方法,事件。那么如果子類需要更改某個方法(通俗的講,可以理解為子類需要一個和父類中同名的方法,但不同的實現),有兩種方法。而這兩種方法的區別,非常重要。
- 使用New關鍵字。當子類中使用New關鍵字來覆蓋父類中的同名方法時,父類的成員則被隱藏了,稱為“隱藏成員”。
- 基類中將成員聲明為虛成員。在基類成員的返回類型之前加關鍵字“virtual ”即可聲明為虛擬成員。派生類,可以對虛擬成員進行重寫,重寫加關鍵字“override ”即可。同樣可以實現替換基類的老成員。
那么,這兩種方式有什么不同呢?
如果使用New來覆蓋基類成員的時候,當派生類實例被轉換為基類型使用的時候,調用的成員會是被New隱藏掉的隱藏成員,是舊的。而如果是通過虛成員重寫的方式,那么調用的,會是被派生類重寫之后的新成員。
明白了么?如果分不清楚,可以這樣記:New覆蓋,只是用新的換了舊的,舊的還是存在,重寫,是把父類的也重新給寫了。
明白這個區別之后,什么時候該怎么用,也明白了吧。
文章列表