隐式与显式接口的实现
可能重复:
C#:接口 – 隐式和显式实现
有人会解释这两个野兽之间的差异,以及如何使用它们。 AFAIK,很多pre.2.0类都是在没有genericstypes的情况下实现的,因此后者版本实现了两种接口types。 是唯一需要使用它的情况吗?
你还可以深入解释如何使用它们。
谢谢
有一个很好的和相当详细的博客文章。
基本上使用隐式接口实现,就像访问类的一部分一样访问接口方法和属性。 使用显式的接口实现时,只能将它视为该接口来访问它们。
对于什么时候使用这个接口,有时候你必须使用明确的接口实现,因为你可能有一个与接口签名相同的属性/方法,或者你想实现两个具有相同签名的接口,那些匹配的属性/方法。
以下规则来自Brad Abrams devise指南博客 。
- 不要使用显式成员作为安全边界。 它们可以由任何向接口投射实例的客户端调用。
- 请使用显式成员来隐藏实现细节
- 请使用显式成员来近似私有接口实现。
- 公开一种替代方法来访问允许子类被覆盖的任何显式实现的成员。 使用相同的方法名称,除非发生冲突。
在Brad的博客中的评论中也提到,在值types上使用显式实现时涉及拳击,因此要注意性能成本。
通俗地说,如果一个类inheritance了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(); }
下面的链接有一个很好的video解释这个概念
显式接口实现
还有一种方法可以从迷宫般的实现本身看到: http : //blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx 。
但是总而言之,隐式实现为您提供了一种types转换,除非对象明确地types转换为该接口types,否则显式实现将无法访问。