是否使用显式接口实现隐藏功能?

PRA*_*T P 7 c# interface

我使用接口来解耦我的代码.我很好奇,是否使用显式接口实现隐藏功能?

例:

public class MyClass : IInterface
{
     void IInterface.NoneWillCall(int ragh) { }
}
Run Code Online (Sandbox Code Playgroud)

只有通过界面明确提供此功能有什么好处和具体用例?

Jon*_*eet 11

根据我的经验,它有两个主要用途:

  • 它允许您通过返回值重载方法.例如,IEnumerable<T>IEnumerable这两种申报GetEnumerator()方式,但返回类型不同-所以要实现这两个,你必须实现明确其中至少有一个.当然在这个问题中,这两个方法都是由接口提供的,但有时你只想给接口方法提供一个不同类型(通常是更具体的一个)的"普通"方法.
  • 它允许您以"令人沮丧"的方式实现接口的一部分 - 例如,ReadOnlyCollection<T>实现IList<T>,但是"阻止"使用显式接口实现的变异调用.这将阻止通过其具体类型了解对象的调用者调用不适当的方法.这有些界面过于宽泛或者执行不当 - 如果你无法履行所有合同,为什么要实现界面呢? - 但从实用的角度来看,它可能很有用.

  • "Discouragement"还允许您有效地"重命名"界面方法.例如,您可能有C类:IDisposable {void IDisposable.Dispose(){this.Close(); public void Close(){...}} - 这样你得到一个公共Close方法,你没有看到可能令人困惑的Dispose方法,但你仍然可以在期望IDisposable的上下文中使用该对象,喜欢"使用"声明. (3认同)