为什么在界面中为什么不在抽象类中

时间:2012-07-12 16:46:44

标签: oop c#-4.0 interface abstract-class

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

    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)(新节目()))。RockOff(“该死的”));'声明显示我们最终访问了“Program”类的私有方法。我的问题是为什么我们不能像接口方法那样隐藏抽象方法的可见性?为什么我们能够通过接口访问私有方法?任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

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

C# 4.0 specification的第13.4.1段引用:

  

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

     

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

     
      
  • 由于无法通过类或结构实例访问显式接口成员实现,因此它们允许从类或结构的公共接口中排除接口实现。当类或结构实现对该类或结构的使用者不感兴趣的内部接口时,这尤其有用。
  •   
  • 显式接口成员实现允许使用相同签名消除接口成员的歧义。如果没有显式的接口成员实现,那么类或结构将不可能具有相同签名和返回类型的接口成员的不同实现,因为类或结构不可能在所有接口成员上具有任何实现。相同的签名但具有不同的退货类型。
  •   

抽象类没有这样的例外,只有regular modifier rules适用。