Re: [問題] 多型疑惑 請教
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
07/05 20:33, 1F
→
07/05 21:31, , 2F
07/05 21:31, 2F
討論串 (同標題文章)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章