3

为什么在实现接口时,如果我将方法设为公开,我不必显式指定接口,但如果我将其设为私有,我必须......像这样(GetQueryString是 IBar 的方法):

public class Foo : IBar
{
    //This doesn't compile
    string GetQueryString() 
    {
        ///...
    }

    //But this does:
    string IBar.GetQueryString() 
    {
        ///...
    }
}

那么,为什么在方法设为私有时必须显式指定接口,而不是在方法设为公开时?

4

1 回答 1

11

显式接口实现是公有和私有之间的一种中间方式:如果您使用接口类型的引用来获取它,它就是公有的,但这是访问它的唯一方法(即使在同一个类中)。

如果您使用隐式接口实现,则需要将其指定为公共,因为它一个公共方法,因为它位于接口中,所以您要覆盖它。换句话说,有效代码是:

public class Foo : IBar
{
    // Implicit implementation
    public string GetQueryString() 
    {
        ///...
    }

    // Explicit implementation - no access modifier is allowed
    string IBar.GetQueryString() 
    {
        ///...
    }
}

就我个人而言,我很少使用显式接口实现,除非它需要基于它是通用接口还是非通用接口IEnumerable<T>具有不同签名的东西:GetEnumerator

public class Foo : IEnumerable<string>
{
    public IEnumerator<string> GetEnumerator()
    {
        ...
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator(); // Call to the generic version
    }
}

在这里,您必须使用显式接口实现来避免尝试基于返回类型重载。

于 2009-06-17T09:59:22.643 回答