Re: [問題] 一小段java程式轉換成C#

看板java作者 (Alien)時間9年前 (2015/08/21 11:35), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《kisha024 (4545454554)》之銘言: : 各位好 如果有一小段java程式 如下 : class A{} : class B extends A{} : class C extends B{} : class P{ : int m(B x) {return 1;} } : class Q extends P{ : int m(A x) {return 2;} } : class R extends Q{ : int m(C x) {return 3;} } : class S extends R{ : int m(B x) {return 4;} : int m(C x) {return 5;} } : R s = new S(); : System.out.println(s.m(new B())); // 4 : 我把它轉換成C# 如下 : public class A { } : public class B : A { } : public class C : B { } : public class P { : public virtual int m(B x) { return 1; } : } : public class Q : P { : public virtual int m(A x) { return 2; } : } : public class R : Q{ : public virtual int m(C x) { return 3; } : } : public class S : R{ : public override int m(B x) { return 4; } : public override int m(C x) { return 5; } : } : R s = new S(); : Response.Write(s.m(new B()) ); // 2 : 很明顯輸出不一樣 java輸出是4 C#輸出是2 : 想請問是我語法轉換上錯誤? 還是有些語法並不能100%轉換過去? : 謝謝 確實答案我不清楚,提供一些方向。 以我所知,Java & C# 的 method overloading 是在 compile time 發生的。 換而言之: R s = new S(); s.m(new B()); 第二行的時候,compiler 會知道要從 R (因為 s 是 R type 的) 下面找出你要 invoke 的 m(). 而在R 底下找到的是在 P 下面定義的 m(B) 到這一步,兩者還是沒分別的。 然後分別在於,C# 直接 invoke 的是 P::m(B),沒有經過 virtual table lookup (就算有 virtual keyword) Java 則有經過 vtable,所以能根據實際 instance 的 type 找到 S::m(B) 至於為什麼 C# 有這種behavior,我就不清楚了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.19.45.239 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1440128147.A.76F.html
文章代碼(AID): #1LrfoJTl (java)
討論串 (同標題文章)
文章代碼(AID): #1LrfoJTl (java)