查看積分策略說明發表回覆
Discuz! 代碼
提示插入
直接插入
說明訊息

插入粗體文本 插入斜體文本 插入下劃線 置中對齊 插入超級連結 插入信件位址 插入圖像 插入 flash 插入代碼 插入引言 插入列表
刪除線 直線分隔線 虛線分隔線
    
添加文字底框
內容 [字數檢查]:

表情符號

更多 Smilies
字型大小 |||
溫馨提示:本區開放遊客瀏覽。


文章關鍵字 : [功能說明]
(關鍵字可加強搜索準確性, 如關鍵字多於一組, 請以 , 作分隔, e.g. : 阿笨,shiuh,第一笨)

 關閉 URL 識別 | html 禁用
 關閉 表情符號 | 表情符號 可用
 關閉 Discuz! 代碼 | Discuz! 代碼 可用
使用個人簽名
接收新回覆信件通知
推薦放檔網絡空間

檔案(Torent, zip等)
  1. freedl
  2. multiupload
  3. btghost
  4. 便當狗
  5. mediafire
  6. pillowangel
圖片(JPG, GIF等)
  1. hotimg
  2. tinypic
  3. mousems2
  4. imageshack
  5. imm.io
>>>歡迎推薦好用空間


最新10篇文章回顧
ecity

 發表於 2005-5-17 05:01 PM

看了各位大大的討論, 小弟也來發表一下自己的拙見.

1. Polymorphism
    一個Object可以在Runtime時轉換為不同的Class Type(即其Implement的Interface及Super Class), 而其真正的Type是其被instance化時的Class. 通常會在開發比較底層的程式時會用到許多這方面的技巧(例如:Framework), 而Design Pattern內也大量運用這種觀念.

2. Overloading
    一個Method具有同名稱但是可以傳入不同型態的變數, 例如Java的System.out.println即是一個Overloading的標準例子.

3. Overriding
    當subclass繼承super class時, 為了能有不同的行為, 此時會改寫super class的Method, 但構成Overriding的條件是要相同名稱, Argument List及Return Type.


Acute

 發表於 2005-4-20 11:13 PM


引用:
Acute寫到:

引用:
jocosn寫到:
那應該怎麼改才對?


2. 多型在程式編譯時期利用判斷訊息參數的類型與個數來決定運作的方法。

應該這樣子, 比較合理 ^^"

Acute.


忘了說, 上面的說法, 是為了彰顯原文這方面的描述不太對勁, 所以, 才會寫上 "XX時期"

就語言定義而言, 基本上, 很少會去描述一個動作應該怎樣做, 也就是, 語言定義裏面, 頂多是寫成 (甚至於很可能不寫, 因為沒必要規定作法):
多型利用判斷訊息參數的類型與個數來決定運作的方法。

實際上如何實作, 則由製作compiler 的人去根據合適的方法達到目標

補述:
通常會出現"結果論" 或"推測論", 都是由其他介紹相關語言之書籍的作者寫進去的.
所謂結果論, 是指, 根據某個或大多數compiler 作法, 而把該作法加入語言介紹中, 變成一個雖然沒錯, 但是不適當的描述.
所謂"推測論", 也是其他人寫語言介紹書時寫進去的, 但是, 因為該作者可能根本不懂compiler 該怎麼做, 只好胡思亂想隨便猜. 個人推測(我也在亂猜), 原文的第二點, 就是作者的"推測"結果, 只是, 該推測結果, 是無法做到的, 呵

一般而言, 真要了解一個語言, 要直接看語言定義的書籍, 這種書, 通常只有一本(俗稱:Bible), 而且, 是由語言定義者直接撰寫出來的. 以C 而言, 就是K&R 親手撰寫的The C programming language. 以C++ 而言, 就是The C++ programming language. (作者我忘了是誰) 用這種書籍當學習語言的入門會很辛苦, 因為書籍的目的是詳盡的介紹語言, 而不是教導如何學習該語言, 但是, 當你真想學好一個語言, 你就是必須花過一次時間, 把bible 仔細研讀一次, 這樣子, 你才能真正了解該語言, 並且不會被曾經看過的書誤導.

Acute.


jocosn

 發表於 2005-4-20 07:39 PM


引用:
Acute寫到:

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


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

Acute.


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


Acute

 發表於 2005-4-20 05:08 PM


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


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

Acute.


jocosn

 發表於 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 作了最後編輯]


swimman

 發表於 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);

}
}


jocosn

 發表於 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 作了最後編輯]


Acute

 發表於 2005-4-20 01:23 AM


引用:
jocosn寫到:
那應該怎麼改才對?


2. 多型在程式編譯時期利用判斷訊息參數的類型與個數來決定運作的方法。

應該這樣子, 比較合理 ^^"

Acute.


swimman

 發表於 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跟多型是沒有關係的


jocosn

 發表於 2005-4-19 02:28 PM

那應該怎麼改才對?


本主題回覆較多,請 點擊這裡 檢閱。



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