顯式接口實現

如果實現兩個接口,並且這兩個接口包含具有相同簽名的成員,那麼在類中實現該成員將導致兩個接口都使用該成員作爲它們的實現。例如:

interface IControl
{
    void Paint();
}
interface ISurface
{
    void Paint();
}
class SampleClass : IControl, ISurface
{
    // Both ISurface.Paint and IControl.Paint call this method.
    public void Paint()
    {
    }
}

然而,如果兩個接口成員執行不同的函數,那麼這可能會導致其中一個接口的實現不正確或兩個接口的實現都不正確。可以顯式地實現接口成員 -- 即創建一個僅通過該接口調用並且特定於該接口的類成員。這是使用接口名稱和一個句點命名該類成員來實現的。例如:

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

類成員 IControl.Paint 只能通過 IControl 接口使用,ISurface.Paint 只能通過 ISurface 使用。兩個方法實現都是分離的,都不可以直接在類中使用。例如:

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.
顯式實現還用於解決兩個接口分別聲明具有相同名稱的不同成員(如屬性和方法)的情況:

interface ILeft
{
    int P { get;}
}
interface IRight
{
    int P();
}
爲了同時實現兩個接口,類必須對屬性 P 和/或方法 P 使用顯式實現以避免編譯器錯誤。例如:

class Middle : ILeft, IRight
{
    public int P() { return 0; }
    int ILeft.P { get { return 0; } }
}

轉自:https://msdn.microsoft.com/zh-cn/library/ms173157(vs.80).aspx#Anchor_0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章