隐式与显式接口实现[重复]
Posted
技术标签:
【中文标题】隐式与显式接口实现[重复]【英文标题】:implicit vs explicit interface implementation [duplicate] 【发布时间】:2010-10-10 13:37:29 【问题描述】:可能重复:C#: Interfaces - Implicit and Explicit implementation
谁能解释这两种野兽之间的区别以及如何使用它们。 AFAIK,许多 pre.2.0 类是在没有泛型类型的情况下实现的,因此导致后一个版本实现了两种类型的接口。是唯一需要使用它们的情况吗?
您能否也深入解释一下如何使用它们?
谢谢
【问题讨论】:
【参考方案1】:There is a good and pretty detailed blog post about this.
基本上,通过隐式接口实现,您可以访问接口方法和属性,就好像它们是类的一部分一样。对于显式接口实现,您只能在将其视为该接口时访问它们。
就何时使用一个而不是另一个而言,有时您必须使用显式接口实现,因为您要么拥有与接口具有相同签名的属性/方法,要么您想要实现具有相同签名的两个接口并具有匹配的属性/方法的不同实现。
以下规则来自 Brad Abrams design guidelines blog。
不要使用显式成员作为安全边界。将实例转换为接口的任何客户端都可以调用它们。 不要使用显式成员来隐藏实现细节 不要使用显式成员来近似私有接口实现。 不要公开另一种方法来访问允许子类覆盖的任何显式实现的成员。除非发生冲突,否则请使用相同的方法名称。Brad 博客中的 cmets 也提到,在对值类型使用显式实现时会涉及到装箱,因此请注意性能成本。
【讨论】:
谢谢!!这解释得很清楚。不过有一点 - 第 2 点和第 3 点不是相同的意思吗?【参考方案2】:通俗的讲,如果一个类继承了 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
【讨论】:
【参考方案3】:还有另一种方式来看待它,从迷宫般的实现本身来看:http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx。
但简而言之,隐式实现为您提供了 is-a 类型转换,除非对象被显式类型转换为该接口类型,否则显式实现将不可访问。
【讨论】:
在此处解决冲突.....“隐式实现”- 仅表示属于同一类本身的具有相同名称和相同签名的特定方法的简单实现,其中“显式实现”-表示使用在该特定类中具有相同名称和签名的接口名称来实现方法。以上是关于隐式与显式接口实现[重复]的主要内容,如果未能解决你的问题,请参考以下文章