首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 介面多重實作同名方法:顯式介面實作完整解析

     編輯:關於C#

問題情境

類別同時實作 IEdit 與 ICombo 兩個介面,兩者都有 Paint() 方法。預設情況下只能實作一個,若需分別實作兩者的 Paint(),必須使用顯式介面實作。

核心規則總結

  1. 同名方法必須採顯式介面實作,不能加 public 等存取修飾詞。
  2. 方法名稱必須冠上介面名稱:void IFace1.Print()、void IFace2.Print()。
  3. 不同名方法正常實作,必須加 public。
  4. 呼叫時需強制轉型為對應介面:((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

應用場景與設計建議

  • 避免命名衝突:繼承多個第三方介面時,方法名稱撞車機率高。
  • 隱藏實作細節:顯式實作的方法不會出現在類別的公用介面中,只能透過介面引用存取,強化封裝。
  • 預設實作與介面隔離:C# 8+ default interface methods 可減少顯式實作需求,但顯式實作仍是解決菱形繼承衝突的標準手段。

總結

顯式介面實作是 C# 解決多重介面同名方法衝突的標準機制。核心口訣:同名加介面前綴無修飾詞,異名正常實作加 public,呼叫時強轉介面類型。掌握此技巧,從容應對複雜介面繼承場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved