可能重複:
Try to describe polymorphism as easy as you can有人可以向我解釋多態性嗎?
我從來沒有能夠充分理解什麼是多態。有人可以用一個例子來解釋它是什麼,它是如何工作的?只是基礎知識。
可能重複:
Try to describe polymorphism as easy as you can有人可以向我解釋多態性嗎?
我從來沒有能夠充分理解什麼是多態。有人可以用一個例子來解釋它是什麼,它是如何工作的?只是基礎知識。
也許最簡單的方法是以非計算機類比開始。
想想看,如果你告訴某人「去商店買一些你最喜歡的晚餐食物。」
如果你對一個14歲的兒子說過這個話,他可能會騎自行車去商店,不得不爲食物支付現金,而且你會吃披薩吃晚飯。
如果你對你的妻子說過,她可能會開車去商店,用卡支付食物,而你可能會用霞多麗來吃雞藍帶。
在一個程序中,事情的工作方式有點相同:你在一個相對抽象的層次上指定某個東西(去商店並拿到晚餐)。每個對象都提供了自己的實現方法,並且在很多情況下提供了一些準確的變化(例如,像上面喜歡的食物的差異)。
當然,當你編程時,大部分需要一個更詳細和明確的規範。總的想法仍然相同。對於上面的場景,您可能有一個定義諸如go to store
和select favorite food
和pay for purchase
等方法的基類(或接口)person
。然後,您可以實施類似adult
和teenager
的實施,其中每個都定義了自己的去商店,選擇最喜歡的食物和支付購買的方法。這些方法是多態的,因爲每個實現都有自己的方式來執行你提供的更高級別的命令。
多態性意味着在運行時根據當前上下文選擇確切的調用函數的能力。
這可以通過描述其他人將從其中派生出的接口類來完成。人們只能在他的代碼中使用界面,而不是使用某些類。這使程序員能夠爲他的問題選擇最佳實現。
作爲一個例子,可以使用數組。可能有兩種可能的兩種實現方式,一種是數組稀疏(大量零),另一種是數組滿了時。不是直接使用一個類,而是定義數組類的接口,然後在上下文中選擇最佳實現。作爲整數數組的一個例子(C++風格),請看以下代碼:
class arrayInterface{
...
virtual int getElement(elementPosition)=0
...
}
class sparseArray : public arrayInterface{
...
virtual int getElement(elementPosition){
implementation
}
...
}
class fullArray : public arrayInterface{
...
virtual int getElement(elementPosition){
implementation
}
...
}
main(){
arrayInterface* array = new fullArray();
// this uses now the implementation specified by fullArray
int element = array->getElement(10)
delete array;
array = new sparseArray
// this uses now the implementation specified by sparseArray
int element = array->getElement(10)
}
從字面上看,多態意味着「具有多種形式」。在編程中,如果一個變量可以保存多種類型的值,那麼這就是一種多態。如果函數可以處理多種類型的參數,那也是多態。
面向對象的語言在類層次結構中具有多態性:對基類或接口的引用可以引用多種類型的對象,只要這些其他類型是從基類派生的即可。這被稱爲亞型多態性。
泛型編程是另一種多態。通過將參數應用於類型,同一位代碼可以處理多種類型的對象。這被稱爲參數多態性。
運算符重載以及類中方法的重載是另一種多態,稱爲ad hoc多態,因爲它比參數或多類型多態不那麼系統化。