2011-05-26 65 views

回答

3

隱式接口的實現是,你必須與接口相同簽名的方法。

明確的接口實現是您明確聲明方法屬於哪個接口的地方。

interface I1 
{ 
    void implicitExample(); 
} 

interface I2 
{ 
    void explicitExample(); 
} 


class C : I1, I2 
{ 
    void implicitExample() 
    { 
     Console.WriteLine("I1.implicitExample()"); 
    } 


    void I2.explicitExample() 
    { 
     Console.WriteLine("I2.explicitExample()"); 
    } 
} 

MSDN:implicit and explicit interface implementations

+0

然後有什麼區別?爲什麼你更喜歡一個在另一個之上? – Killerwes 2011-05-26 14:12:08

+0

如果您有兩個接口具有相同的方法簽名,您可以顯式聲明兩個方法爲每個方法實現方法。或者,如果您希望清楚的是實現接口的方法可以明確聲明。存在隱式聲明是因爲大多數情況下你並不需要明確聲明,並且可以假定接口實現。 – 2011-05-26 14:15:53

2

顯式簡單意味着您指定接口,隱式意味着您不接受。

例如:

interface A 
{ 
    void A(); 
} 

interface B 
{ 
    void A(); 
} 

class Imp : A 
{ 
    public void A() // Implicit interface implementation 
    { 

    } 
} 

class Imp2 : A, B 
{ 
    public void A.A() // Explicit interface implementation 
    { 

    } 

    public void B.A() // Explicit interface implementation 
    { 

    } 
} 
+0

因此,類Imp中的public void A是一個隱式接口,因爲它是在該類中創建的,並且沒有對接口A的引用(不是AA())。如果它會是A.A()它會是一個明確的接口? 那麼在使用上有什麼區別呢? – Killerwes 2011-05-26 14:10:38

+0

@Killerwes - 這就是_implementation_方面,正因如此。因爲兩個接口都聲明瞭同一個成員,所以我認爲在Imp2中是明確的。在調用代碼時,您需要正確的接口引用來調用Imp2的不同顯式實現。 – Oded 2011-05-26 14:17:00

9

當你實現一個接口explicitlty,該接口上的方法將只有當對象作爲接口引用可見:在

public interface IFoo 
{ 
    void Bar(); 
} 

public interface IWhatever 
{ 
    void Method(); 
} 

public class MyClass : IFoo, IWhatever 
{ 
    public void IFoo.Bar() //Explicit implementation 
    { 

    } 

    public void Method() //standard implementation 
    { 

    } 
} 

如果某個地方代碼你有這個對象的參考:

MyClass mc = new MyClass(); 
mc.Bar(); //will not compile 

IFoo mc = new MyClass(); 
mc.Bar(); //will compile 

對於標準im plementation,這不要緊,你如何引用對象:

MyClass mc = new MyClass(); 
mc.Method(); //compiles just fine 
1

另外,如果你想知道爲什麼明確的實施存在,那是因爲你可以實現同樣的方法,從多個接口(名稱和簽名);那麼如果你需要不同的功能,或者只是返回類型不同,你不能通過簡單的重載來實現。那麼你將不得不使用明確的實現。一個例子是List<T>實施IEnumerableIEnumerable<T>並且都具有GetEnumerator()但具有不同的返回值。