經常,一個類會實現多個接口,比如用戶的一個控件繼承自"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();
//
}
}
}