1

我知道被覆盖的方法/属性的访问说明符可见性必须与基本方法/属性的访问说明符的可见性相同或更高,并且我还知道接口成员的可见性默认情况下是公共的。那么当我们在类中显式实现接口时,成员的可见性如何以及为什么可以是私有的,尽管可以通过将类对象转换为实现的接口来访问这些私有方法?

    public interface IRocker
{
    string RockOff(string str);
}
public abstract class AmAbstract
{
    public abstract string SomeMethod(string str);
}
class Program : AmAbstract, IRocker
{
    static void Main(string[] args)
    {
        new Hello().RockU();
        Console.ReadKey();
    }

    string IRocker.RockOff(string str)
    {
        return str;
    }

    public override string SomeMethod(string str)
    {
        return str;
    }
}

public class Hello
{
    public void RockU()
    {
        Console.WriteLine(((IRocker)(new Program())).RockOff("Damn"));
        Console.WriteLine(((AmAbstract)(new Program())).SomeMethod("lalalalala"));

    }
}

'Console.WriteLine(((IRocker)(new Program())).RockOff("Damn"));' 语句向我们展示了最终访问类“程序”的私有方法。我的问题是为什么我们不能像使用接口方法那样隐藏抽象方法的可见性?为什么我们能够通过接口访问私有方法?任何帮助将不胜感激。

4

1 回答 1

2

您在实现时使用显式接口IRocker.RockOff()实现。C# 中有单独的规则,实际上这些规则同时是私有的和公共的。

C# 4.0 规范第 13.4.1 段的引用:

显式接口成员实现具有与其他成员不同的可访问性特征。因为在方法调用或属性访问中,显式接口成员实现永远不能通过它们的完全限定名称访问,所以它们在某种意义上是私有的。但是,由于可以通过接口实例访问它们,因此它们在某种意义上也是公共的。

显式接口成员实现有两个主要目的:

  • 因为显式接口成员实现不能通过类或结构实例访问,所以它们允许将接口实现从类或结构的公共接口中排除。当一个类或结构实现一个对该类或结构的使用者不感兴趣的内部接口时,这特别有用。
  • 显式接口成员实现允许消除具有相同签名的接口成员的歧义。如果没有显式的接口成员实现,一个类或结构不可能有具有相同签名和返回类型的接口成员的不同实现,就像一个类或结构不可能在所有接口成员上都有任何实现一样相同的签名但具有不同的返回类型。

抽象类没有此类例外,因此仅适用常规修饰符规则

于 2012-07-12T17:27:08.130 回答