類別同時實作 IEdit 與 ICombo 兩個介面,兩者都有 Paint() 方法。預設情況下只能實作一個,若需分別實作兩者的 Paint(),必須使用顯式介面實作。
void IFace1.Print()、void IFace2.Print()。((IFace1)obj).Print()。using System;
namespace TestInterface
{
interface IFace1
{
void Print();
void Hello();
}
interface IFace2
{
void Print();
void Goodbye();
}
class FacetoFace : IFace1, IFace2
{
// 顯式實作 IFace1.Print
void IFace1.Print()
{
Console.WriteLine("這是 IFace1 的 Print 函數");
}
// 正常實作 IFace1.Hello(不同名)
public void Hello()
{
Console.WriteLine("IFace1 向您說 Hello!");
}
// 正常實作 IFace2.Goodbye(不同名)
public void Goodbye()
{
Console.WriteLine("IFace2 向您說 GoodBye");
}
// 顯式實作 IFace2.Print
void IFace2.Print()
{
Console.WriteLine("這是 IFace2 的 Print 函數");
}
}
class Program
{
static void Main()
{
var face = new FacetoFace();
// 必須轉型呼叫顯式實作方法
((IFace1)face).Print(); // 輸出:這是 IFace1 的 Print 函數
((IFace2)face).Print(); // 輸出:這是 IFace2 的 Print 函數
// 正常方法直接呼叫
face.Hello(); // 輸出:IFace1 向您說 Hello!
face.Goodbye(); // 輸出:IFace2 向您說 GoodBye
}
}
}
| 錯誤寫法 | 原因 | 修正 |
|---|---|---|
public void IFace1.Print() | 顯式實作不能有存取修飾詞 | 移除 public |
void Print()(無介面前綴) | 編譯器無法區分實作哪個介面 | 加上介面名稱前綴 |
不同名方法忘記 public | 預設為 private,外部無法呼叫 | 加上 public |
default interface methods 可減少顯式實作需求,但顯式實作仍是解決菱形繼承衝突的標準手段。顯式介面實作是 C# 解決多重介面同名方法衝突的標準機制。核心口訣:同名加介面前綴無修飾詞,異名正常實作加 public,呼叫時強轉介面類型。掌握此技巧,從容應對複雜介面繼承場景。