引用:
感謝 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);
}
}