C# 明確方式實作介面

明確方式實作介面(Explicit Interface Implementation)

如果一個class去實作兩個有相同方法的interface,會發生什麼事?
程式如下,分別有兩個interface IControlIAction都含有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
{
// Both IAction.Move and IControl.Move call this method.
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;

// The following lines all call the same method.
example.Move();
control.Move();
action.Move();

// Output:
// Move method in ExampleClass
// Move method in ExampleClass
// Move method in ExampleClass

結果是都會呼叫同一個實作。


但是你可能希望個自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;

// The following lines all call the same method.
//example2.Move(); // Compiler error.
control.Move(); // Calls IControl.Move on ExampleClass2.
action.Move(); // Calls IAction.Move on ExampleClass2.

// Output:
// IControl.Move
// ISurface.Move

此時,不可以直接透過實作class的物件去直接呼叫,會出現編譯錯誤,必須要把該物件轉換為對應的interface,例如如果你想呼叫IControl的Move方法,那麼就把它轉換為IControl。

注意:Explicit Interface Implementation是沒有存取修飾詞的,因為它無法當做其定義類型的成員來存取。它只有在透過interface的執行個體呼叫時才能存取。

參考:https://learn.microsoft.com/zh-tw/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation

評論