2011-10-12 50 views

回答

35

也許最簡單的方法是以非計算機類比開始。

想想看,如果你告訴某人「去商店買一些你最喜歡的晚餐食物。」

如果你對一個14歲的兒子說過這個話,他可能會騎自行車去商店,不得不爲食物支付現金,而且你會吃披薩吃晚飯。

如果你對你的妻子說過,她可能會開車去商店,用卡支付食物,而你可能會用霞多麗來吃雞藍帶。

在一個程序中,事情的工作方式有點相同:你在一個相對抽象的層次上指定某個東西(去商店並拿到晚餐)。每個對象都提供了自己的實現方法,並且在很多情況下提供了一些準確的變化(例如,像上面喜歡的食物的差異)。

當然,當你編程時,大部分需要一個更詳細和明確的規範。總的想法仍然相同。對於上面的場景,您可能有一個定義諸如go to storeselect favorite foodpay for purchase等方法的基類(或接口)person。然後,您可以實施類似adultteenager的實施,其中每個都定義了自己的去商店,選擇最喜歡的食物和支付購買的方法。這些方法是多態的,因爲每個實現都有自己的方式來執行你提供的更高級別的命令。

2

多態性意味着在運行時根據當前上下文選擇確切的調用函數的能力。

這可以通過描述其他人將從其中派生出的接口類來完成。人們只能在他的代碼中使用界面,而不是使用某些類。這使程序員能夠爲他的問題選擇最佳實現。

作爲一個例子,可以使用數組。可能有兩種可能的兩種實現方式,一種是數組稀疏(大量零),另一種是數組滿了時。不是直接使用一個類,而是定義數組類的接口,然後在上下文中選擇最佳實現。作爲整數數組的一個例子(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) 

} 
12

從字面上看,多態意味着「具有多種形式」。在編程中,如果一個變量可以保存多種類型的值,那麼這就是一種多態。如果函數可以處理多種類型的參數,那也是多態。

面向對象的語言在類層次結構中具有多態性:對基類或接口的引用可以引用多種類型的對象,只要這些其他類型是從基類派生的即可。這被稱爲亞型多態性。

泛型編程是另一種多態。通過將參數應用於類型,同一位代碼可以處理多種類型的對象。這被稱爲參數多態性。

運算符重載以及類中方法的重載是另一種多態,稱爲ad hoc多態,因爲它比參數或多類型多態不那麼系統化。

相關問題