2010-04-23 66 views
4

多重遺傳與多態性有什麼區別?多重遺傳與多態性有什麼區別?

在一本書我紅了行說

存在在類級別多繼承不支持。這意味着您一次不能擴展一個以上的課程。

這是矛盾的多態的概念,在同一本書作爲

多態性描述爲創建從特定的基類

現在幾個對象的過程中,如果多重繼承沒有在PHP不允許那麼多態是如何被允許的呢?

+0

PHP不允許多態...? – SeanJA 2010-04-23 06:04:09

+0

...因爲它是一種弱類型的語言 – SeanJA 2010-04-23 06:05:46

+0

那麼爲什麼課本在OOP的書中解釋了多態性的概念呢在PHP – 2010-04-23 06:07:10

回答

18

就像Ikke說的,多重遺傳與多態性無關。

如果我能畫一個類圖,多重繼承是這樣的:

Base A Base B 
^  ^
    \  /
    \ /
    Child 

所以,該類Child會繼承來自兩個類的屬性和行爲。 Java和PHP等許多語言都不允許這樣做,但Python確實如此。

多態性另一方面,是當你可以抽象出專業化。首先,類圖:

 Animal 
    ^^
    / \ 
/  \ 
Cat  Dog 

而且你可以做到以下幾點:

// Assuming we have a pack of animals 
// This is Java 
for (Animal pet : pack) 
    pet.speak(); 

每個pet會說這取決於實現不同的事情。

+0

Ahaaa很好的解釋這是在我心中的錯誤觀念謝謝很多Xavier ...... – 2010-04-23 06:35:57

+1

多態性在PHP中的問題是因爲返回類型沒有被強制執行(它是一種弱類型語言),所以不能保證'speak'實際返回一個字符串。它可能會返回一個數據庫對象。 (見http://stackoverflow.com/questions/749712/is-what-seems-like-polymorphism-in-php-really-polymorphism) – SeanJA 2010-04-23 07:30:52

+0

明智的解釋,+1 – Jimmy 2010-04-23 07:59:48

1

這兩者有很小的關係。

多重繼承是編譯時/運行後靜態的東西。多態性是一種僅在運行時確定調用子類型上的哪種方法的技術。

PHP不允許多繼承。

3

多繼承意味着一個對象從兩個不同的父類繼承。程序員自行車手既是程序員又是自行車手。當程序員類將其成員數據favorite_activity定義爲hacking而自行車手也具有favorite_activity但它是riding時出現問題。如果你問程序員自行車手她的favorite_activity是什麼,那麼正確的答案是什麼?

多態性涉及對象的行爲。它可以讓你告訴一個對象去做一些事情,並讓結果的動作取決於對象的類,即使你不知道它到底是什麼。所以你遇到一個Person,雖然你不知道它是一個Programmer還是一個Cook,並且你告訴她perform_your_job()。如果是程序員,她會編寫代碼,如果是庫克她會做飯,但是您不必特別告訴她write_code()make_a_meal()

+1

可以用多晶形來闡述一下嗎?..它的有趣.. plsss可以做到這一點... – 2010-04-23 06:33:27