明確方式實作介面(Explicit Interface Implementation) 如果一個class去實作兩個有相同方法的interface,會發生什麼事? 程式如下,分別有兩個interface IControl
與 IAction
都含有Move()方法,其中ExampleClass去實作這兩個Interface。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public interface IControl { void Move () ; } public interface IAction { void Move () ; } public class ExampleClass : IControl , IAction { public void Move () { Console.WriteLine("Move method in ExampleClass" ); } }
執行
1 2 3 4 5 6 7 8 9 10 11 12 13 ExampleClass example = new ExampleClass(); IControl control = example; IAction action = example; example.Move(); control.Move(); action.Move();
結果是都會呼叫同一個實作。
但是你可能希望個自Interface執行不同的實作,這時就可以使用Explicit Interface Implementation如下:
1 2 3 4 5 6 7 8 9 10 11 public class ExampleClass2 : IControl , IAction { void IControl.Move() { System.Console.WriteLine("IControl.Move" ); } void IAction.Move() { System.Console.WriteLine("IAction.Move" ); } }
執行
1 2 3 4 5 6 7 8 9 10 11 12 ExampleClass2 example2 = new ExampleClass2(); IControl control = example2; IAction action = example2; control.Move(); action.Move();
此時,不可以直接透過實作class的物件去直接呼叫,會出現編譯錯誤,必須要把該物件轉換為對應的interface,例如如果你想呼叫IControl的Move方法,那麼就把它轉換為IControl。
注意 :Explicit Interface Implementation是沒有存取修飾詞的,因為它無法當做其定義類型的成員來存取。它只有在透過interface的執行個體呼叫時才能存取。
參考:https://learn.microsoft.com/zh-tw/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation