隐式vs显式接口实现

时间:2009-02-28 21:29:13

标签: c# .net interface

  

可能重复:
  C#: Interfaces - Implicit and Explicit implementation

有人会解释这两种野兽之间的差异以及如何使用它们。 AFAIK,许多pre.2.0类在没有泛型类型的情况下实现,因此导致后一版本实现这两种接口。是唯一需要使用它们的情况吗?

您还可以深入解释如何使用它们吗?

由于

3 个答案:

答案 0 :(得分:112)

There is a good and pretty detailed blog post about this.

基本上使用隐式接口实现,您可以访问接口方法和属性,就好像它们是类的一部分一样。使用显式接口实现,只有在将其视为该接口时才能访问它们。

就何时使用一个而不是另一个而言,有时您必须使用显式接口实现,因为您要么具有与接口具有相同签名的属性/方法,要么您希望实现具有相同签名的两个接口并具有匹配的那些属性/方法的不同实现。

以下规则来自Brad Abrams design guidelines blog

  • 不要使用显式成员作为安全边界。任何将实例强制转换为接口的客户都可以调用它们。
  • 使用显式成员隐藏实施细节
  • 执行使用显式成员来近似私有接口实现。
  • 执行公开一种替代方法来访问允许子类重写的任何显式实现的成员。除非发生冲突,否则请使用相同的方法名称。

Brad的博客评论中也提到,在价值类型上使用显式实现时会涉及到拳击,因此请注意性能成本。

答案 1 :(得分:22)

通俗地说,如果一个类继承自2个或更多接口,并且接口碰巧具有相同的方法名,那么如果使用隐式接口实现,则该类不知道正在实现哪个接口方法。这是您明确实现接口的场景之一。

隐式界面实施

public class MyClass : InterfaceOne, InterfaceTwo
{
    public void InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

显式界面实施

public class MyClass : InterfaceOne, InterfaceTwo
{
    void InterfaceOne.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }

    void InterfaceTwo.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

以下链接有一个很好的视频解释这个概念
Explicit Interface Implementation

答案 2 :(得分:4)

还有一种方法可以从迷宫实现本身来看:http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx

但简而言之,隐式实现为您提供了一种类型转换,除非对象显式地类型转换为该接口类型,否则无法访问显式实现。