Re: [問題] 一小段java程式轉換成C#
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章