隐式与显式接口实现

可能的复制品:
C # : 接口-隐式和显式实现

有人能解释一下这两种野兽的区别以及如何使用它们吗。AFAIK,许多前2.0的类实现没有泛型类型,因此导致后一版本实现两种风格的接口。这是唯一需要使用它们的情况吗?

你还能深入地解释一下如何使用它们吗?

谢谢

51637 次浏览

有一个很好的和相当详细的博客文章关于这一点。

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

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

以下规则来自 Brad Abrams 设计指南博客

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

Brad 博客的评论中也提到,在对值类型使用显式实现时,会涉及到装箱,所以要注意性能成本。

还有一种方法可以从错综复杂的实现本身来看待它: http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx

但是简而言之,隐式实现提供了一个 is-a 类型转换,除非对象显式类型转换为该接口类型,否则显式实现将无法访问。

用外行的话来说,如果一个类继承自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();
}

下面的链接有一个很好的视频来解释这个概念
显式接口实现