2012-07-12 159 views
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)(新计划()))RockOff( “该死”));'声明显示我们最终访问班'Program'的私人方法。我的问题是为什么我们无法像使用接口方法那样隐藏抽象方法的可见性?为什么我们能够通过接口访问私有方法?任何帮助将不胜感激。

+0

不要急于接口,如果没有要求,坚持抽象类。 – umlcat 2012-07-12 20:25:25

+0

我建议刚好相反,使用接口,直到你绝对必须使用抽象类。接口使实现更清晰,但抽象类有时很方便。 – jpe 2012-07-13 05:57:13

回答

2

您在执行IRocker.RockOff()时正在使用显式接口实现。对于那些使用C#的人来说有单独的规则,实际上这些规则都是私有的,同时也是公共的。

C# 4.0 specification第13.4.1引述:

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

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

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

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

相关问题