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

时间:2011-05-25 19:35:02

标签: c# interface

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

示例:

public class MyClass : IInterface
{
     void IInterface.NoneWillCall(int ragh) { }
}

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

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:4)

一个例子是ICloneable。通过明确地实现它,您仍然可以拥有强类型版本:

public class MyClass : ICloneable {
    object ICloneable.Clone() {
       return this.Clone();
    }

    public MyClass Clone() {
       return new MyClass() { ... };
    }
}

答案 2 :(得分:2)

它不是用于隐藏方法,而是为了能够以不同的方式从不同的接口实现具有相同签名/名称的两个方法。

如果IA和IB都有操作F,则只能通过显式实现接口为每个F实现不同的方法。

答案 3 :(得分:2)

它可以用于隐藏。例如,一些实现IDisposable的classess明确地这样做,因为他们也有Close()方法做同样的事情。

当您在一个类上实现两个接口并且存在签名冲突并且功能因接口而异时,您还可以使用显式接口定义。但是,如果发生这种情况,通常表明你的班级做得太多了,你应该考虑将功能分开一点。