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就不同,它有權選擇接受還是拒絕,當然,拒絕的條件是提供有自己特色的實現。