程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 基類與接口混合繼承的聲明問題(4)

基類與接口混合繼承的聲明問題(4)

編輯:關於C語言

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();
  }
}

結果還是一樣!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved