4. 探索新問題 & 解決新問題
那麼,我們如何糾正這種非預期的多態行為呢?一個簡單的回答就是把B1的聲明改成跟B2的一樣。但這樣,所有繼承於A的派生類都必須照做,沒得商量!還有其他的辦法嗎?有的,請先看如下代碼:
interface IC
{
void M();
}
class A : IC
{
void IC.M()
{
this.M();
}
public virtual void M()
{
Console.WriteLine("In class A");
}
}
class B1 : A
{
public override void M()
{
Console.WriteLine("In class B1");
}
}
class B2 : A, IC
{
public override void 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 B1
In class B2
這樣,多態的效果就如我們所願了!當然,現在B2聲明中的IC又顯得有點多余了,但你可以輕松把它拿掉!另外,如果測試程序換成:
class Program
{
static void Main()
{
List<A> ace = new List<A>();
ace.Add(new A());
ace.Add(new B1());
ace.Add(new B2());
foreach (A a in ace)
a.M();
}
}
結果還是一樣!