作者tfshnike (得寸进尺)
看板C_Sharp
标题Re: [问题] 多型疑惑 请教
时间Tue Jul 5 09:31:17 2011
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
1F:推 QQ29:想问一下 我加上new跟不加上new 在什麽case下会有问题呀 07/05 20:33