2012-07-12 117 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適用。

相關問題