RSS   



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


 


 
主題: [轉貼] 什麼是多型的解釋   字型大小:||| 
swimman
驢手小試
等級: 2


 . 積分: 8
 . 文章: 63
 . 收花: 55 支
 . 送花: 5 支
 . 比例: 0.09
 . 在線: 956 小時
 . 瀏覽: 80 頁
 . 註冊: 7202
 . 失蹤: 3287
#1 : 2005-4-19 02:23 AM     全部回覆 引言回覆

樓主的這種說法是沒錯不過比較抽象
比較實際的例子像是SHAPE形狀是一個父類別,有一個抽象的方法是計算面積
而有三角形和圓形兩種子類別
利用shape來宣告但是實例可能是三角形或是圓形是在執行期才能確定
也就編譯期無法確定必須在執行期才能確定,也就是必須LATE Binding
那麼在RUNTIME時計算面積就會有不同的行為
或是宣告一個介面跟繼承介面實做的CLASS也是一樣



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


 . 積分: 8
 . 文章: 63
 . 收花: 55 支
 . 送花: 5 支
 . 比例: 0.09
 . 在線: 956 小時
 . 瀏覽: 80 頁
 . 註冊: 7202
 . 失蹤: 3287
#2 : 2005-4-19 10:58 PM     全部回覆 引言回覆


引用:
jocosn寫到:
依留言順序回答



我舉一個 Java 的例子

class A {
     void myInstanceMethod( ) {
         System.out.println("Class A's instance method.");
     }
}

class B extends A {        // extends 表示繼承
   void myInstanceMethod(int a) {
        System.out.println("Class B's instance method.");
   }
}

class Demo {
    public static void main (String args[ ]) {
        A obj = new B();
        obj.myInstanceMethod(5);     // Class B's instance method ??? ---problem X
    }
}
[jocosn 在 2005-4-19 06:17 AM 作了最後編輯]


既然obj是用A宣告的  當然就以為他是A,不論obj是怎麼NEW的
所以就只有一個不帶參數的myInstanceMethod方法
用B的myInstanceMethod(int)方法compiler在邊譯期就會檔下來,根本就進不了RUNTIME
除非強制轉型
強制轉型後就轉為RUNTIME的時期才進行檢查

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



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


 . 積分: 8
 . 文章: 63
 . 收花: 55 支
 . 送花: 5 支
 . 比例: 0.09
 . 在線: 956 小時
 . 瀏覽: 80 頁
 . 註冊: 7202
 . 失蹤: 3287
#3 : 2005-4-20 09:15 AM     全部回覆 引言回覆


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


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

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


因為一開始宣告obj是A所以obj就是A,
Compiler不會認為obj跟B有什麼關係當然就不會有兩個方法




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

請問 2 個問題:
1 是強制轉型要怎麼轉?
2 是強制轉型不會喪失多型的精神嗎?


強制轉型在JAVA就直接(B)obj就可以了跟C的語法是一樣的
當然不見得執行期會成功(比如說有個C繼承A而這個obj是new C();)
不過compiler認為那不是他的事了,會讓你通過編譯
是的,後期連結的確在刑別檢查上是很鬆散的
所以那是你的責任在執行期進行型別檢查後再做轉型
在某些情況下是一定要做這種轉型




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

OVERLOADING 幾乎是每個 OO 語言的功能要求,是沒什麼了不起。
可是有點疑問的是這句:"基本上OVERLOADING跟多型是沒有關係的"。那是什麼跟多型有關係呢?我對多型的全貌並不是十分了解。
我講一下我的認知: OVERLOADING 只是達到多型的一種手段,但 OVERLOADING 不代表多型的全部。不知道是否有錯。


OVERLOADING基本上跟多型沒關係
你要OVERLOADING幾個同名的FUNCTION
你就必須實做幾個FUNCTION
這個跟OO一點關連都沒有(c++可以寫出一個程式完全沒有CLASS確有OVERLOADING的函式)
基本上跟OPERATION OVERLOAD有點像都只是語法的糖衣
OVERLOADING只是讓你少背了幾個函示的名稱
用的時候比較方便
試想
沒有overloading
class a{
void f(void){}
int f1(int i){return i;}
double f2(double d){return d;}

public static void main(string[] args){
f();
int i=f1(1);
double d=f2(1.0);

}
}

有overloading

class a{
void f(void){}
int f(int i){return i;}
double f(double d){return d;}

public static void main(string[] args){
f();
int i=f(1);
double d=f(1.0);

}
}



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

   

快速回覆
表情符號

更多 Smilies

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

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


 



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