2017-01-14 133 views
2

我在閱讀有關隱式或顯式接口方法的實現,但我仍不明白它是如何工作的以及有哪些好處。接口實現:隱式與顯式

具有代碼:

interface InterfaceOne 
{ 
    void MethodOne(); 
} 

class ClassOne : InterfaceOne 
{ 
    public void MethodOne() 
    { 
     Console.WriteLine("hello from the class method"); 
    } 

    void InterfaceOne.MethodOne() 
    { 
     Console.WriteLine("hello from the interface method"); 
    } 
} 

而且從main方法的代碼:

var c1 = new ClassOne(); 
    c1.MethodOne(); 

    InterfaceOne i1 = new ClassOne(); 
    i1.MethodOne(); 
    Console.ReadLine(); 

,這裏是輸出:從類方法

你好

你好從接口方法

我的問題:

  1. 爲什麼我沒有有兩種方法具有相同的名稱和簽名類的錯誤?

  2. 當我使用var關鍵字時,編譯器如何選擇調用哪個方法?

  3. 有什麼好處?

+0

@MarcinJuraszek它不是重複的,因爲你提到的問題沒有回答我的第二個問題 –

回答

1

爲什麼我沒有一個錯誤有兩個方法具有相同的名稱和簽名的類?

因爲這就是顯式接口實現的工作原理。它允許你有兩個版本的相同的方法。使用的方法由用於調用它的參考類型決定。

當我使用var關鍵字時,編譯器如何選擇調用哪個方法?

它使用類型推斷。 documentation指出:

局部變量可以被賦予一個推斷的「類型」的var而不是顯式類型。 var關鍵字指示編譯器從表達式推斷變量的類型在初始化語句的右側

所以它要使用任何類型的右側返回

是什麼好處?

大部分時間沒有。但是如果你希望你的對象在通過某個接口訪問時採取不同的行爲,這就是實現它的方法。

+0

你能給我一個鏈接,指出「編譯器選擇了最可能的選擇」嗎? –

+0

@BudaGavril我的不好,它似乎只是使用任何權利。無論如何都添加了鏈接 – BradleyDotNET

0

明確的好處是,有時你需要它來解決歧義。想象一下你需要在同一個類中實現兩個不同的接口的場景,它們都有一個同名的方法。

這是更多的事情,因爲有時候這是必要的,不是因爲它應該是你的設計的計劃A.

1

爲什麼我沒有一個類有兩個方法的錯誤 相同的名稱和簽名?

因爲您正在使用允許的語言功能。

當我使用var關鍵字時,編譯器如何選擇調用哪個方法 ?

使用var在這裏並不重要。所有重要的是調用方法的變量類型。

var c1 = new ClassOne(); 
InterfaceOne i1 = new ClassOne(); 

var c1Result = c1.MethodOne(); 
var c2Result = c2.MethodOne(); 

有什麼好處?

它主要是指允許實現多個接口,用同樣的方法:

interface One { 
    int Foo(); 
} 

interface Two { 
    int Foo(); 
} 

沒有顯式接口實現,你將無法擁有它實現了兩個,併爲他們提供不同的實現類。