2013-08-01 103 views
2

這對我來說是一個驚喜!當我看到別人的代碼,我只是指出這條線(縮短的版本!)如何在此上下文中調用接口方法?

interface IPrint 
{ 
    void PrintDateTimeNow(); 
} 

class DatePrint : IPrint 
{ 
    void IPrint.PrintDateTimeNow() 
    { 
     throw new NotImplementedException(); 
    } 

    public PrintDateTimeNow() 
    { 
     throw new NotImplementedException(); 
    } 
} 

我試圖調用此方法和功能「PrintDateTimeNow()」被調用。

 var obj = new DatePrint(); 
     obj.PrintDateTimeNow(); 

這意味着,該方法的目的是什麼IPrint.PrintDateTimeNow()?

如何調用IPrint.PrintDateTimeNow()?

爲什麼編譯器允許另一個同名的方法?

+1

這就是所謂的顯式接口implentation ... –

+0

@andreas niedermair:謝謝你..但是,在它的優點? –

+0

只要按照我提供的MSDN文章...和優勢的問題可能有點太基於意見... –

回答

3

IPrint.PrintDateTimeNow()是一個所謂的明確的接口定義,而不是一個隱式接口定義。您將在C# Interfaces. Implicit implementation versus Explicit implementation

// This will call the implicit implementation 
var obj = new DatePrint(); // same as DatePrint obj = new DatePrint(); 
obj.PrintDateTimeNow(); 

// This will call the explicit implementation 
IPrint obj = new DatePrint(); 
obj.PrintDateTimeNow(); 

找到一個精心製作的回答你的問題如果由於某種原因,你想這兩種情況下的行爲方式不同,你需要兩個顯性和隱性的定義。如果他們的行爲相同,則明確的定義是多餘的,可能會被拋棄。

就我個人而言,我不會過早添加它們,以防萬一在將來某個時候您可能需要。我認爲這違反了YAGNI原則。

+0

Tks的術語「顯式接口」。但是,我仍然不清楚這裏的顯式接口的優點是什麼? –

+0

@nowhewhomustnotbenamed。我更新了我的答案。 –

1

它被稱爲顯式接口實現...請閱讀關於該特定主題的MSDN

實現接口的類可以顯式實現該接口的成員 。當成員被明確實現時,不能通過類實例訪問 ,而只能通過接口的實例 訪問。

1

IPrint.PrintDateTimeNow()explicit interface implementation。你需要投objIPrint爲了調用IPrint.PrintDateTimeNow()

((IPrint)obj).PrintDateTimeNow(); 

這可能是有益的,如果你的類實現了聲明相同的成員(或成員具有相同的名稱)複式接口

1

的顯式實現當您訪問obj這樣纔會被調用:

相關問題