簡體   English   中英

顯式接口實現,為什么顯式轉換

[英]explicit interface implementation, why explicit casting

當一個類顯式實現一個接口時,為什么需要將類實例顯式地轉換為接口才能使用已實現的方法?

(此示例取自此處: MSDN:顯式接口實現

您有兩個接口,如下所示。

interface IControl
{
    void Paint();
}
interface ISurface
{
    void Paint();
}

然后你明確地實現它們。

public class SampleClass : IControl, ISurface
{
    void IControl.Paint()
    {
        System.Console.WriteLine("IControl.Paint");
    }
    void ISurface.Paint()
    {
        System.Console.WriteLine("ISurface.Paint");
    }
}

現在,要使用接口,您需要以下代碼。

// Call the Paint methods from Main.

SampleClass obj = new SampleClass();
//obj.Paint();  // Compiler error.

IControl c = (IControl)obj;
c.Paint();  // Calls IControl.Paint on SampleClass.

ISurface s = (ISurface)obj;
s.Paint(); // Calls ISurface.Paint on SampleClass. 

在上面的代碼塊中,為什么你有

IControl c = (IControl)obj;

而不是

IControl c = obj;

我混淆的原因是,例如,您可以執行以下操作

IDictionary<string, string> c = new Dictionary<string, string>();

沒有明確地將new DictionaryIDictionary

謝謝。

當一個類顯式實現一個接口時,為什么需要將類實例顯式地轉換為接口才能使用已實現的方法?

就編譯器而言,該成員實際上不存在於類中 - 它只存在於接口上。 您不必顯式強制轉換 - 您只需要具有編譯時類型的接口的引用。 這可以隨心所欲地完成,包括隱式轉換。

在上面的代碼塊中,為什么你有

 IControl c = (IControl)obj; 

而不是

 IControl c = obj; 

你不必。 隱式轉換應該絕對正確。 不得不為了調用該方法在一個單一的表達,例如明確投

obj.Paint(); // Invalid
((IControl) obj).Paint(); // Valid

但是如果你通過賦值給接口類型的單獨局部變量進行隱式轉換,那很好 - 該方法仍然使用目標表達式調用,該表達式是接口類型。

僅當類型從多個接口繼承並且某些方法在多個接口中具有相同的名稱/簽名時,才需要顯式接口實現。

休息是優先事項和慣例。

mpleClass obj = new SampleClass();
//obj.Paint();  // Compiler error. 

obj.Paint() - >這是錯誤,因為當完成顯式接口實現時,底層接口實現需要MSDN中指定的顯式obj.Paint()

在方法調用,屬性訪問或索引器訪問中,無法通過其完全限定名稱訪問顯式接口成員實現。 顯式接口成員實現只能通過接口實例訪問,並且在這種情況下僅通過其成員名稱引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM