Oh,程式碼無法編譯,編譯器發脾氣了:
'B1.IC.M()': containing type does implement interface 'IC'
換句話說,我們不能在 B1 裡重新實作 IC.M 方法,只能默默接受從基類繼承而來的那一個!再修改一下:
interface IC { void M(); }
class A : IC
{
void IC.M() { Console.WriteLine("In class A"); }
}
class B1 : A { }
class B2 : A, IC
{
void IC.M() { Console.WriteLine("In class B2"); }
}
class Program
{
static void Main()
{
List<IC> cs = new List<IC>();
cs.Add(new A());
cs.Add(new B1());
cs.Add(new B2());
foreach (IC c in cs) c.M();
}
}
這些編譯正常通過,結果是:
In class A
In class A
In class B2
3. 得出結論 & 新問題展現
好吧,有結果了。B1 和 B2 兩種繼承方式的效果確不同,具體體現在多態行為上(有關多態介紹,可參見《今天你多態了嗎?》)。B1 是可憐蟲,必須接受 A 對 IC.M 的實現,無法改變命運;然而 B2 不同,它有權選擇接受還是拒絕,當然拒絕條件是提供自己特色的實現。