This question和Eric Lippert's answer让我想知道:在实现接口的方法时,您是如何做决定是使用显式还是隐式实现?
答案 0 :(得分:8)
(个人而言)当具有相同签名的方法之间存在冲突时,我只看到需要显式实现。
例如,在实现IEnumerable<T>
时,您应该实现两个具有相同签名的方法GetEnumerator()
,但返回类型除外。因此,您必须明确实施IEnumerable.GetEnumerator()
:
public abstract class MyClass<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
return ...;
}
IEnumerator IEnumerable.GetEnumerator() // explicit implementation required
{
return GetEnumerator();
}
}
显式实现的另一个用途是,如果您不希望通过对象实例调用该方法,而只是通过接口调用该方法。我个人认为这没有多大意义,但在一些非常罕见的情况下,它可能很有用。
答案 1 :(得分:3)
Philippe的回答是实用的,但是,也有建筑方面的考虑因素。
接口用于使类兼容,以便其他对象可以使用它们。如果只有那些消费对象需要接口的功能,那么它应该受到限制 - 通过最小特权原则。如果没有必要将该接口方法暴露给该类的所有其他用户。
保罗答案 2 :(得分:1)
显式接口的另一种情况是对象需要实现接口以接受来自内部对象的调用,但您不希望将这些接口作为API的一部分公开。