隐式<>显式接口[重复]

Posted

技术标签:

【中文标题】隐式<>显式接口[重复]【英文标题】:Implicit <> Explicit interface [duplicate] 【发布时间】:2011-09-02 15:19:31 【问题描述】:

可能的重复:C#: Interfaces - Implicit and Explicit implementationimplicit vs explicit interface implementation

你好

谁能解释一下隐式接口和显式接口之间的区别?

谢谢!

【问题讨论】:

相关列表中大约有十几个精确的骗子...... 【参考方案1】:

当你显式地实现一个接口时,该接口上的方法只有在对象被作为接口引用时才可见:

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

对于标准实现,如何引用对象并不重要:

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

【讨论】:

【参考方案2】:

隐式接口实现是指您拥有具有相同接口签名的方法。

显式接口实现是显式声明方法所属的接口。

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

【讨论】:

那在使用上有什么区别呢?为什么你更喜欢其中一个? 当您有 2 个具有相同方法签名的接口时,您可以显式声明 2 个实现每个方法的方法。或者,如果您希望明确存在用于实现接口的方法,则可以显式声明。存在隐式声明是因为大多数情况下您并不需要显式声明,并且可以假设接口实现。【参考方案3】:

显式表示您指定接口,隐式表示您不指定。

例如:

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
    

    

【讨论】:

因此,类 Imp 中的 public void A 是一个隐式接口,因为它是在该类中创建的,并且没有对接口 A 的引用(不是 A.A() )。如果它是 A.A() 它会是一个显式接口?那在使用上有什么区别呢? @Killerwes - 这是 实施 方面,因此您是正确的。我必须在Imp2 中明确说明,因为两个接口都声明了相同的成员。在调用代码时,您需要正确的接口引用才能调用 Imp2 的不同显式实现。【参考方案4】:

另外,如果您想知道为什么存在显式实现,那是因为您可以从多个接口实现相同的方法(名称和签名);那么如果你需要不同的功能,或者只是返回类型不同,你不能通过简单的重载来实现。那么你将不得不使用显式实现。一个例子是List&lt;T&gt; 实现了IEnumerableIEnumerable&lt;T&gt;,两者都有GetEnumerator(),但返回值不同。

【讨论】:

以上是关于隐式<>显式接口[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#接口的隐式和显式实现之间的区别[重复]

区别 b/w 在 C# 中隐式实现成员和显式实现成员 [重复]

IReadOnlyCollection 上的隐式/显式转换混淆

简单的interface显式和隐式的实现

显式提交/隐式提交 //ajax方式的隐式提交

C#接口的隐式和显式实现