C#中接口多重繼承的注意事項

經常,一個類會實現多個接口,比如用戶的一個控件繼承自"IEdit"和"ICombo",每個接口無疑都有一個Paint方法來供子類實現如何畫他們,但是多重繼承就會出現問題,默認情況下,C#止允許實現Paint方法。


現在有一個比較鑽牛角尖的問題,如何在派生的類裏面實現這兩個接口的相同名稱的方法呢?

  通過試驗,翻閱MSDN,我總結了這麼幾條規律:
  本文可參考 MSDN 配合理解

  1。要麼只實現一個方法,否則函數重明,就會存在二義性


  2。如果確實想兩個方法都實現,必須在接口的實現部分注意這麼幾點:
    (1)。對有相同名稱的方法在實現時,前面不能加public等關鍵詞。每個方法前必須冠以相應的接口名。

  比如:void IFace1.Print(){......};
            void IFace2.Print(){......};
    (2)。對於不通名稱的方法,事項是前面必須冠以"public"標識符。
  以上兩個規則缺一不可,否則會收到編譯錯誤。


  3。創建類實例時,如何引用不通接口的相同方法呢?方法如下:
             如果調用那個接口的實現,則必須將示例強制轉換爲相應接口類型。
             比如:
             FacetoFace face;
             ((IFace1)face).Print();或者
            ((IFace2)face).Print();

完整的例子見下面

using System;

namespace TestInterface
{
 /// <summary>
 /// Class1 的摘要說明。
 /// 本代碼演示了C#中接口的基本特徵,並檢驗了作者心中迷惑但是書中沒有詳細講解的地方,比如接口多重
 /// 繼承時,多個父類接口有相同的方法時,派生接口如何定義、使用的問題
 /// </summary>
 interface IFace1
 {
  void Print();
  void Hello();
 }
 interface IFace2
 {
  void Print();
  void Goodbye();
 }
 class FacetoFace : IFace1,IFace2
 {
  #region IFace1 成員

  void IFace1.Print()
  {
   Console.WriteLine("這是IFace1的Print函數");
  }

  public void Hello()
  {
   // TODO:  添加 FacetoFace.Hello 實現
   Console.WriteLine("IFace1向您說Hello!");
  }

  #endregion

  #region IFace2 成員
 
  public void Goodbye()
  {
   // TODO:  添加 FacetoFace.Goodbye 實現
   Console.WriteLine("IFace2向您說GoodBye");
  }
 
  void IFace2.Print()
  {
   Console.WriteLine("這是IFace2的Print函數");
  }

  #endregion
 }
 class Class1
 {
  /// <summary>
  /// 應用程序的主入口點。
  /// </summary>
  [STAThread]
  static void Main(string[] args)
  {
   //
   // TODO: 在此處添加代碼以啓動應用程序
   FacetoFace facetest1=new FacetoFace();
   ((IFace1)facetest1).Print();
   ((IFace2)facetest1).Print();
   facetest1.Hello();
   facetest1.Goodbye();
   //
  }
 }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章