我应该显式还是隐式实现接口成员?

8
3个回答

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();
    }
}

显式实现的另一个用途是,如果你不希望通过对象实例调用该方法,而只想通过接口调用。我个人认为这没有太多意义,但在一些非常罕见的情况下,它可能会有用。


3

菲利普的回答是很实用的,但是还有架构上的考虑。

接口被用来使类之间兼容,以便它们可以被其他对象使用。如果只有那些消费对象需要接口的功能,则应该按最小权限原则限制其使用范围。将接口方法暴露给类的所有其他用户是不必要的。

保罗


你能想到一个适用的例子吗? - jasonh
Web开发。如果一个类被设计为在网络上提供服务,那么可能会有用于身份验证的方法,在其他情况下(本地)可能不会使用。这是一个鲜为人知的C#特性,我认为它经常被忽视。还有其他的例子吗? - Paul

1
另一个需要显式接口的情况是,对象需要实现一个接口来接受来自内部对象的调用,但您不希望将其作为 API 的一部分公开。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接