Re: [問題] 多型疑惑 請教

看板C_Sharp (C#)作者 (得寸進尺)時間14年前 (2011/07/05 09:31), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串2/2 (看更多)
Foo2 實作了介面 Foo 所以這一段 Foo f = new Foo3(); f.Initial(); 是明確呼叫 foo的方法,也就是實作類 Foo2的所實作的Initial() 所以理所當然是印出"Foo2" 而Foo3 的情況是有一個方法簽章 跟 Foo2 相同, 所以compiler才會提示遮蔽 意思是如果你使用 Foo3 f = new Foo3(); f.Initial(); 就會印出Foo3 遮蔽了父類別Foo2的方法 我猜你是想要 override父類別方法 那可以改成這樣 public class Foo2 : Foo { : public virtual void Initial() : { : Console.WriteLine("Foo2"); : } } public class Foo3 : Foo2 { : public override void Initial() : { : Console.WriteLine("Foo3"); : } } 這樣就會印出 Foo3 ---------------------------------------------- C#跟java不一樣 所有可複寫的方法都要加上 virtual or abstract 關鍵字 http://msdn.microsoft.com/zh-tw/library/ebca9ah3(v=VS.90).aspx 題外話,如果要遮蔽父類別方法可以用 new 關鍵字 http://msdn.microsoft.com/zh-tw/library/435f1dw2.aspx ※ 引述《QQ29 (我愛阿蓉)》之銘言: : 不好意思 以下有個簡單的測試程式 想要請教一下觀念 : interface Foo : { : void Initial(); : } : public class Foo2 : Foo : { : public void Initial() : { : Console.WriteLine("Foo2"); : } : } : public class Foo3 : Foo2 : { : public void Initial() : { : Console.WriteLine("Foo3"); : } : } : 而我使用 Foo f = new Foo3(); : f.Initial(); : 我不懂為什麼是印Foo2.... : 實作interface的class 應該就具有override的特性 : 那繼承Foo2的class 中的Initial : 且compiler有warning說我Foo3::Initial遮蔽了 : Foo2的Initial : 我不太懂在C#這種情況 會造成我無法直接 呼叫Foo2的initial? : 請各位給點意見吧...有點不太懂這地方 : 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.65.162.2

07/05 20:33, , 1F
想問一下 我加上new跟不加上new 在什麼case下會有問題呀
07/05 20:33, 1F

07/05 21:31, , 2F
參考這網址 http://ppt.cc/364D
07/05 21:31, 2F
文章代碼(AID): #1E4cbd8v (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #1E4cbd8v (C_Sharp)