PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   請問有沒有人能夠白話解釋Polymorphism(OOP) (https://www.pcdvd.com.tw/showthread.php?t=932546)

53346 2011-06-10 10:06 PM

請問有沒有人能夠白話解釋Polymorphism(OOP)
 
翻了很多C++的書和網上搜尋,書上不是沒解釋就是解釋的看不懂,
網上的東西一樣沒看到一個很明確的白話解釋...

Polymorphism=同名異式=多型
而這東西又常常和Overloading(多載)和Overriding(改寫)做比較,
就我的認知:

Overloading:
同一涵式有不同的引數型態和參數內容

Overrinding:
子類別和父類別有相同涵式名稱與內容的時候,子類別會取代父類別
(也就是呼叫涵式的時候只會呼叫到子類別)

Polymorphism:
是一種由繼承產生出來的衍生類別應用。
但這個我真的就搞不太清楚白話怎麼解釋...
我只想到:
動物類別內容有:四肢、發聲
繼承動物類別的人是:兩手兩腳、說話
繼承動物類別的鳥是:兩翅兩足、鳴叫
但又覺得這種舉例很怪 :jolin:

naoru 2011-06-11 09:47 AM

引用:
作者53346

Polymorphism=同名異式=多型
而這東西又常常和Overloading(多載)和Overriding(改寫)做比較,
就我的認知:
:


我也不懂... :ase
把它拆成
Poly + morphism
來解釋會不會容易懂一些勒

twu2 2011-06-11 10:29 AM

我也不清楚我的想法對不對, 不過我是這樣子想的.

1. overloading => 使用相同 function 名稱的不同 function (有不同的參數)
2. overriding => 子類別直接取代原父類別的功能.
3. polymorphism => 我也想不出白話的解釋, 不過以你的例子來看.

父 class 是 "animal" (動物), 有兩個繼承動物的子類別 "human" (人) 與 "bird" (鳥). 類別有個 function 是 "getLegs" (四肢).

各自使用各自的 class 時, 並沒有 polymorphism 的問題.
如在單獨操作 "human" 這個類別的 instance 時, 會傳回 "兩手兩足", 在單獨操作 "bird" 這個類別的 instance 時, 會傳回 "兩翅兩足".
用程式來看就是:

bird b = new bird;
b.getLegs() 傳回 "兩翅兩足".

human h = new human;
h.getLegs() 傳回 "兩手兩足".

而 polymorphism 會發生在於你是用父類別來操作這些子類別的時候.
如:

animal a1 = new bird;
a1.getLegs() 傳回 "兩翅兩足".

anumal a2 = new human;
a2.getLegs() 傳回 "兩手兩足".

也就是 a1, a2 都是 animal (動物), 但實際上 a1 是 bird (鳥) 這種 animal (動物), a2 是 human (人) 這種 animal (動物).

但是當程式比較複雜時, 你可能會有某個 function 是針對 animal 去操作的, 這時, 在那個 function 中, 只知道是對 animal 操作, 不會知道是對 bird 還是 human 操作, 這就叫 polymorphism.
如:
function GetAnimalLegs(animal *a)
{
return a->getLegs(); // 你不會知道這是什麼, 要看執行時傳進來的是什麼而定.
}

harrisonlin 2011-06-12 05:17 PM

多型是指如果一群類別有著相同的介面,那麼你就可以按照你的需求隨時替換.

例如你的程式需要一隻鳥(雙翅,雙足,有喙),而你剛好手上有老鷹,燕子,企鵝(即使它不會飛只會游),那你就可以隨便放哪隻上去都行,因為他們都具有相同的介面.

多型的好處是只要介面符合,你放什麼東西上去都可以,這樣就讓類別間的耦合度降低,達到物件容易重用的目的了.

在動態型別的語言中(python, ruby),甚至不需要型別或介面相同.只要會有個東西雙翅雙足有喙,那它就可以在你的程式中當一隻鳥,而不用真的繼承鳥類別或鳥介面.

53346 2011-06-14 08:49 PM

知識+看到的解釋
 
Polymorphism又稱為多型,他的討論要在類別間有繼承關係才有意義,而他的定義很少發現有人能一次說得很清楚。

簡單來說,多型是指子類別繼承父類別時,同時改寫父類別的函式或變數,而我們可以宣告一個屬於父類別的變數,去存取子類別中改寫自父類別的函式或變數,這我們稱之為多型。

舉個生活一點的例子,若有一個父類別是動物,那麼有一個子類別鳥繼承自動物這個類別,當我們看到鳥的時侯,可以說牠是一隻鳥,也可以說牠是一隻動物。同樣的東西,卻有不同的表示型態
---------------------------------------------------------------------------------------
我是對裡面提稻子類別繼承父類別後同時改寫富類別的涵式或變數感到納悶 :confused:

twu2 2011-06-14 09:32 PM

以 c++ 來說, 就是指 virtual function 來實現 "多型". (多型是一個概念, 實際運作就是依靠 virtual function)

在實際使用上, 子類別繼承父類別時, 可以改寫 virtual function 來做出子類別與父類別在同一個名稱的 virtual function 可以有不同的結果.
這時, 當以父類別的來操作這些 instance (可能是父類別, 也可能是子類別), 就會依據實際的 instance 所代表的類別會有不同的結果.

53346 2011-06-14 09:48 PM

引用:
作者twu2
以 c++ 來說, 就是指 virtual function 來實現 "多型". (多型是一個概念, 實際運作就是依靠 virtual function)

在實際使用上, 子類別繼承父類別時, 可以改寫 virtual function 來做出子類別與父類別在同一個名稱的 virtual function 可以有不同的結果.
這時, 當以父類別的來操作這些 instance (可能是父類別, 也可能是子類別), 就會依據實際的 instance 所代表的類別會有不同的結果.


感謝朋友兩篇前後兩篇熱心的回應:)

最近還有看到幾個多型白化的解釋:
1.就像電視遙控器,只要搞定通訊內容就能控制不同的電視
2.就好比見人說人話見鬼說鬼話
ex:今天老闆問你為什麼遲到,你回路上塞車,換作同事問,則回答其實是睡過頭...
(這個例子對方還有用java寫出程式內容 :ase )

所以拿C++來說就是用virtual function來達成用同一個介面控制不同類別的方式
實作多型 :confused:

twu2 2011-06-14 10:13 PM

我覺得第二個例子應該不算吧, 看不出有繼承發生的地方.
第一個例子應該算是.


所有的時間均為GMT +8。 現在的時間是05:26 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。