經常,一個類會實現多個接口,比如用戶的一個控件繼承自"IEdit"和"ICombo",每個接口無疑都有一個Paint方法來供子類實現如何畫他們,但是多重繼承就會出現問題,默認情況下,C#止允許實現Paint方法.現在有一個比較鑽牛角尖的問題,如何在派生的類裡面實現這兩個接口的相同名稱的方法呢?
通過試驗,翻閱MSDN,我總結了這麼幾條規律:
本文可參考 MSDN 配合理解
1.要麼只實現一個方法,否則函數重明,就會存在二義性
2.如果確實想兩個方法都實現,必須在接口的實現部分注意這麼幾點:
( 1 ).對有相同名稱的方法在實現時,前面不能加public等關鍵詞.每個方法前必須冠以相應的接口名.比如:void IFace1.Pr
int( )
{
......
}
;
void IFace2.Pr
int( )
{
......
}
;
( 2 ).對於不通名稱的方法,事項是前面必須冠以"public"標識符.
以上兩個規則缺一不可,否則會收到編譯錯誤.
3.創建類實例時,如何飲用不通接口的相同方法呢?方法如下:1.如果調用那個接口的實現,則必須將示例強制轉換為相應接口類型.比如:FacetoFace face;
( ( IFace1 )face ).Pr
int( );
或者( ( IFace2 )face ).Pr
int( );
完整的例子見下面
using System;
namespace TestInterface
{
/// <summary>
/// Class1 的摘要說明.
/// 本代碼演示了C#中接口的基本特征,並檢驗了作者心中迷惑但是書中沒有詳細講解的地方,比如接口多重
/// 繼承時,多個父類接口有相同的方法時,派生接口如何定義、使用的問題
/// </summary>
interface IFace1
{
void Pr
int( );
void Hello( );
}
interface IFace2
{
void Pr
int( );
void Goodbye( );
}
class FacetoFace : IFace1,IFace2
{
#region IFace1 成員
void IFace1.Pr
int( )
{
Console.WriteLine( "這是IFace1的Pr
int函數" );
}
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.Pr
int( )
{
Console.WriteLine( "這是IFace2的Pr
int函數" );
}
#endregion
}
class Class1
{
/// <summary>
/// 應用程序的主入口點.
/// </summary> [STAThread] static void Main(
string[] args )
{
//
// TODO: 在此處添加代碼以啟動應用程序
FacetoFace facetest1=new FacetoFace( );
( ( IFace1 )facetest1 ).Pr
int( );
( ( IFace2 )facetest1 ).Pr
int( );
facetest1.Hello( );
facetest1.Goodbye( );
//
}
}
}