RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 


 
主題: [轉貼] 什麼是多型的解釋   字型大小:||| 
jocosn
白銀驢友
等級: 15等級: 15等級: 15等級: 15等級: 15


今日心情

 . 積分: 1386
 . 精華: 2
 . 文章: 2945
 . 收花: 9537 支
 . 送花: 3671 支
 . 比例: 0.38
 . 在線: 1295 小時
 . 瀏覽: 19041 頁
 . 註冊: 7452
 . 失蹤: 1454
#1 : 2005-4-17 09:25 AM     全部回覆 引言回覆

同名異式(Polymorphism)=多型=動態繫結(Dynamic binding)

1. 定義相同名稱的操作,以不同的方式處理不同類型的資料
2. 多型在程式執行期利用動態連結(Dynamic Binding)的方式判斷訊息參數的類型
 與個數來決定運作的方法。
3. 達到物件導向中「多型」的方法
  抽象類別 (abstract class):
  抽象類別是為了讓方法的使用更多樣化,物件轉換型別為抽象類別後,即使
  方法名稱相同,其實作的內容與執行結果卻不同。


by 朱孝國

[jocosn 在 2005-4-17 09:26 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
jocosn
白銀驢友
等級: 15等級: 15等級: 15等級: 15等級: 15


今日心情

 . 積分: 1386
 . 精華: 2
 . 文章: 2945
 . 收花: 9537 支
 . 送花: 3671 支
 . 比例: 0.38
 . 在線: 1295 小時
 . 瀏覽: 19041 頁
 . 註冊: 7452
 . 失蹤: 1454
#2 : 2005-4-19 05:39 AM     全部回覆 引言回覆

依留言順序回答


引用:
Acute寫到:

引用:
jocosn寫到:2. 多型在程式執行期利用動態連結(Dynamic Binding)的方式判斷訊息參數的類型與個數來決定運作的方法。

不知道是說哪個語言
但是以C++ 而言, 這一段不太對勁
C++ 的多形性靠的是編譯時期就決定好該呼叫哪個函式
......
所以, 多形很容易就可以在編譯時期決定好, 該呼叫誰, 因為名字被偷改了
....

抱歉,沒講清楚是用那種語言。
我轉貼的多型解釋講的應該是 Java,一時不查,sorry。



引用:
Acute寫到:
就正常的角度來看, 如果執行時期才去辨認參數... 決定呼叫哪個函式...
那程式的額外負擔有多重阿...
...........

這我不知道負擔有多重,因為我的 C++  是在 10 年前學的,那時 OO 觀念才剛在台灣萌芽,standard C++ 還沒出來,各家編譯器實作也不同。至於現在,我幾乎沒寫過 C++ 程式,所以不知道他執行的速度。不過,Java 跑起來很慢倒是真的。它的 GUI 也做的很醜很爛。

...(之前錯誤範例,刪掉,以免造成事後看的人誤解)....

在這篇 http://www.microsoft.com/taiwan/ ... nctionPointer_1.htm 有提到Java 和 C++ 都是用 Virtual Table,我不知道真假,我沒看過 Java 實現多型的內部機制文章。C++ 倒是有看過。
我沒記錯的話,C++  對於要達到多型的手法都要宣告methods為 virtual;但是 Java 不用,預設動作就是。


不過因為小神童的提醒,我再仔細看了一下這段,如果是針對 Java,會比較有問題
3. 達到物件導向中「多型」的方法
  抽象類別 (abstract class):
  抽象類別是為了讓方法的使用更多樣化,物件轉換型別為抽象類別後,即使
  方法名稱相同,其實作的內容與執行結果卻不同。

不一定是指抽象類別,Java 有所謂的 interface(C++是以 pure abstract class 來表示 interface 的概念),甚至是一般類別也可以做到。所以我覺得這篇多型文章前後矛盾。
事後加註:多型的手法不只是靠抽象類別,還要靠繼承。

剛找到一篇 C++ 的,有興趣的人可以參考一下。
http://squall.cs.ntou.edu.tw/cpp ... iding_Overload.html

-------------------------------------------------------------------

引用:
GERRYccc寫到:
我猜喔~~純屬猜測..........
你想問的是不是 屬於 函數重載 的部份?!..............

是指多載overload ? 還是覆載override?
電腦名詞的中文名稱很混亂。
有人認為 overloade 和 override 都是多型,有人認為 override 才是。

[jocosn 在 2005-4-20 01:29 PM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
jocosn
白銀驢友
等級: 15等級: 15等級: 15等級: 15等級: 15


今日心情

 . 積分: 1386
 . 精華: 2
 . 文章: 2945
 . 收花: 9537 支
 . 送花: 3671 支
 . 比例: 0.38
 . 在線: 1295 小時
 . 瀏覽: 19041 頁
 . 註冊: 7452
 . 失蹤: 1454
#3 : 2005-4-19 10:11 AM     全部回覆 引言回覆

小神童你好神阿,短短時間就可以打出這麼多東西。
你真是有料的人阿,怪不得稱為小神童。可惜我看 2 段就眼花了。
我先送你一隻花,不過東西太長,我先抓一個重點問問。
我很好奇其他 3 朵花是誰送的?



引用:

我們來思考一件最基本的動作, 一個compiler or 一個interpreter 如何去產生一段runtime 程式碼


配合下列這一段

引用:

如果, 程式是執行時期才去辨認該用哪個function, 那麼程式很輕易的就會掉入一個陷阱裏面, 假設function Power 有三種型態, 分別是: Power (int, int), Power (char, char), Power (int, char)
今天寫程式的人沒留N到, 寫了一個 Power (char, int), 那麼, 這個錯誤是不是要等到執行時期才發現他錯? compiler 沒有能力也不該有能力發現他錯誤呢? 因為compiler 並不負責去辨認該怎麼call, right ? 可是實際上, 不管使用哪一種OO 語言, 他都是在compiler 時期就被挑出來的錯誤, 呵


加上原文
多型在程式執行期利用動態連結(Dynamic Binding)的方式.....

這裡所說的「動態連結(Dynamic Binding)」,不知道 Acute 是怎麼定義或去看?
我對底層沒有研究,有錯請加以指正。
舉一個例子,compile 時會先編譯多個 functions,執行時配合 object 型態去呼叫那一個 function,這就叫做動態連結,所以只要在記憶體還是哪裡配置一個區塊,專放物件要存放的資料就好。
所以沒有產生額外的程式碼,只有產生額外的資料。

至於 Power (char, int) 這個錯誤如果等到執行時期才發現,我覺得應該會因為沒有定義到這個 function,所以當然編譯錯誤,不用等到執行,這好像跟多型沒關係?就像你呼叫一個你沒定義的變數 X 一樣。

哈,我覺得我好像不太對!
因為抓不到小神童要問的重點!

[jocosn 在 2005-4-19 10:31 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
jocosn
白銀驢友
等級: 15等級: 15等級: 15等級: 15等級: 15


今日心情

 . 積分: 1386
 . 精華: 2
 . 文章: 2945
 . 收花: 9537 支
 . 送花: 3671 支
 . 比例: 0.38
 . 在線: 1295 小時
 . 瀏覽: 19041 頁
 . 註冊: 7452
 . 失蹤: 1454
#4 : 2005-4-19 02:28 PM     全部回覆 引言回覆

那應該怎麼改才對?


[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
jocosn
白銀驢友
等級: 15等級: 15等級: 15等級: 15等級: 15


今日心情

 . 積分: 1386
 . 精華: 2
 . 文章: 2945
 . 收花: 9537 支
 . 送花: 3671 支
 . 比例: 0.38
 . 在線: 1295 小時
 . 瀏覽: 19041 頁
 . 註冊: 7452
 . 失蹤: 1454
#5 : 2005-4-20 01:36 AM     全部回覆 引言回覆

感謝 swimman 的解釋,小弟有幾點疑問,還請幫忙釐清:



引用:
swimman寫到:
所以就只有一個不帶參數的 myInstanceMethod 方法

"只有一個"是什麼意思呢?B 繼承 A,所以不是應該有 2 個myInstanceMethod 方法:帶參數與不帶參數的?



引用:
swimman寫到:
用B的myInstanceMethod(int)方法compiler在邊譯期就會檔下來,根本就進不了RUNTIME
除非強制轉型
強制轉型後就轉為RUNTIME的時期才進行檢查

請問 2 個問題:
1 是強制轉型要怎麼轉?
2 是強制轉型不會喪失多型的精神嗎?[事後補註] 此處誤以為swimman兄是在講 override


引用:
swimman寫到:
基本上函數的 OVERLOADING 並不是什麼了不起的東西
根據C++的函式語意學
C++會將函數名稱跟所使用參數加在一起成為新的函數名稱
所以函數名稱一樣參數不一樣就會變成不同的函數
所以在邊譯期就可以進行檢查知道要叫哪一個函數
這也就意味著回傳值的不同是不能構成可以辨別的新涵數
基本上OVERLOADING跟多型是沒有關係的

OVERLOADING 幾乎是每個 OO 語言的功能要求,是沒什麼了不起。
可是有點疑問的是這句:"基本上OVERLOADING跟多型是沒有關係的"。那是什麼跟多型有關係呢?我對多型的全貌並不是十分了解。[事後補註] 此處誤以為swimman兄是在講 override
我講一下我的認知: OVERLOADING 只是達到多型的一種手段,但 OVERLOADING 不代表多型的全部。不知道是否有錯。
[事後補註] 此處誤以為swimman兄是在講 override,所以應該改為Override 只是達到多型的一種手段,但 override 不代表多型的全部。


以上幾點,還請幫忙釐清觀念。:

[jocosn 在 2005-4-20 01:17 PM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
jocosn
白銀驢友
等級: 15等級: 15等級: 15等級: 15等級: 15


今日心情

 . 積分: 1386
 . 精華: 2
 . 文章: 2945
 . 收花: 9537 支
 . 送花: 3671 支
 . 比例: 0.38
 . 在線: 1295 小時
 . 瀏覽: 19041 頁
 . 註冊: 7452
 . 失蹤: 1454
#6 : 2005-4-20 01:06 PM     全部回覆 引言回覆

感謝 swimman 兄的幾點觀念,但是我感覺我誤解 swimman 兄的意思。小弟提出幾個看法

引用:
基本上OVERLOADING跟多型是沒有關係的

對不起,就是這句話,此處是寫 OVERLOADING ,一時不查以為是 override。所以我全面的留言有錯誤,我等會去改過來加註。
我的程式碼是因為看不小神童在問什麼,所以用到 OVERLOADING,完全是個錯誤的範例,造成誤解請見諒。


引用:
c++可以寫出一個程式完全沒有 CLASS 確有 OVERLOADING 的函式

個人補充:
確實如此,如果大家還沒忘記的話,因為 C++ 要考慮 C 語言的相容性, C 是個 OO 的語言嗎?不是。但是 C++ 進一步提供 OO 的功能,因為 C++ 是一個多種設計思維面考慮的語言,你可以寫一個完全不 OO ,或完全 OO 的語言。你可以寫一個完全沒有 class 的程式,但是可以跑,但是這種程式絕對沒有多型的功能
今天,一個沒有 CLASS 但確有 override 的函式,在 java, C# 上都不可能出現。所以不能說 override 跟多型沒有關係。因為沒有 override,就沒有多型,但是有了 override,不一定就會有多型。

[jocosn 在 2005-4-20 01:24 PM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
jocosn
白銀驢友
等級: 15等級: 15等級: 15等級: 15等級: 15


今日心情

 . 積分: 1386
 . 精華: 2
 . 文章: 2945
 . 收花: 9537 支
 . 送花: 3671 支
 . 比例: 0.38
 . 在線: 1295 小時
 . 瀏覽: 19041 頁
 . 註冊: 7452
 . 失蹤: 1454
#7 : 2005-4-20 07:39 PM     全部回覆 引言回覆


引用:
Acute寫到:

引用:
jocosn寫到:
我的程式碼是因為看不小神童在問什麼,所以用到 OVERLOADING,完全是個錯誤的範例,造成誤解請見諒。


呵, 我都沒問啥阿, 我只是說, 那個描述是有問題的, 如此而已哩

Acute.


就是因為沒問啥,所以不知道要答啥?



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記

   

快速回覆
表情符號

更多 Smilies

字型大小 : |||      [完成後可按 Ctrl+Enter 發佈]        

溫馨提示:本區開放遊客瀏覽。
選項:
關閉 URL 識別    關閉 表情符號    關閉 Discuz! 代碼    使用個人簽名    接收新回覆信件通知
發表時自動複製內容   [立即複製] (IE only)


 



所在時區為 GMT+8, 現在時間是 2024-11-22 01:10 AM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.029111 second(s), 7 queries , Qzip disabled