2015-09-18 37 views
-1

我對編程並不陌生,但我總是對關於面向對象的一些基本概念感到困惑。目前我正在開發使用C#,我不知道WHY和WHEN(或者如果它是不可能的)使用以下的組合?使用公共,私人,保護和類/變量組合的原因?

  1. 與私人/受保護成員<公共類---(編輯:這是愚蠢的,忽略此)
  2. 私人/保護公共成員爲2類

特別是,我不能想想可以應用的任何場景。

編輯:

我問的是,沒有任何理由或場景,而不是

public class A{ 
    private class B{ 
     public member x,y,z... 
    } 
} 

public class A{ 
    private class B{ 
     private/protected member x,y,z... 
    } 
} 

,因爲我的想法是一樣,如果一個人真正想封裝B類,裏面的成員不應該公開...

+0

可能使用公共方法的私人類的重複?(http://stackoverflow.com/questions/7777256/private-class-with-public-method) –

+0

只有當它們嵌套在內部時,類纔可以是私有的或受保護的其他類,否則它們是公開的或內部的(如果未指定,內部是默認的)。如果你認爲它是一個嵌套類,那麼私有類可以被它自己的類型訪問,並且可以訪問它的公共方法,這樣做更有意義。 –

+0

@RonBeyer但是在什麼情況下會發生這樣的情況:public class A - > private class B - > public members?而不是使用B中的私有/受保護成員更有意義?我在混合什麼? – shole

回答

2

讓我們看看幾個例子,第一公共類私有/ protected成員:

public class PublicClass 
{ 
    public void PublicMethod() 
    { 
     ProtectedMethod();  //Valid call 
     PrivateMethod();  //Also valid 
    } 
    protected void ProtectedMethod() 
    { 
     PublicMethod();   //Valid 
     PrivateMethod();  //Valid 
    } 
    private void PrivateMethod() 
    { 
     PublicMethod();   //Valid 
     PrivateMethod();  //Valid 
    } 
} 

public class SomeOtherClass 
{ 
    public void SomeMethod() 
    { 
     PublicClass c = new PublicClass(); 
     c.PublicMethod();  //Valid 
     c.ProtectedMethod(); //Invalid, not accessible 
     c.PrivateMethod();  //Also invalid 
    } 
} 

這裏,所有這些類別呼叫都在內部有效,但對PublicClass以外的任何內容都不可見,包括任何來自PublicClass的類別。 ProtectedMethod也隱藏在類之外,但仍繼承PublicClass,這樣的類訪問:

public class InheritedPublicClass : PublicClass 
{ 
    public void MyPublicMethod() 
    { 
     PublicMethod();  //Calls base class method 
     ProtectedMethod(); //Calls base class method 
     PrivateMethod(); //Invalid, not accessible 
    } 
} 

PrivateMethod()的調用是一個編譯時錯誤,因爲它不是在InheritedPublicClass訪問。

Private允許您創建僅對直接類可見的方法,並且除此之外沒有任何方法。受保護允許您創建內部可見的方法,並且可以從任何派生類中看到它們。

現在讓我們看一個私有類:

public class ParentClass 
{ 
    private class NestedClass 
    { 
     public void PublicMethod() { } 
     private void PrivateMethod() { } 
    } 

    private void SomeMethod() 
    { 
     //NestedClasscan only be created by methods of ParentClass 
     var nc = new NestedClass(); 
     nc.PublicMethod();  //Internally visible 
     nc.PrivateMethod();  //Invalid, not accessible 
    } 
} 

這裏NestedClass是私有的,因爲它是嵌套在ParentClass。對於包括繼承者的NestedClass以外的任何人都不可見。如果我們將它保護起來,那麼繼承者將能夠看到它。

此外,NestedClass.PrivateMethod()在嵌套類的實現之外不可見。

這對於在類之外沒有任何意義的內部數據結構很有用。

+0

正是我期望的...非常感謝! – shole

0

單例模式有一些使用嵌套/內部private類的實現。

偉大的Jon Skeet解釋了單線程模式實現從非線程安全變體一直到.NET 4.0的Lazy<T>實現here的演變。

從上面的鏈接private類的例子,是這樣的:

public sealed class Singleton 
{ 
    private Singleton() 
    { 
    } 

    public static Singleton Instance { get { return Nested.instance; } } 

    private class Nested 
    { 
     // Explicit static constructor to tell C# compiler 
     // not to mark type as beforefieldinit 
     static Nested() 
     { 
     } 

     internal static readonly Singleton instance = new Singleton(); 
    } 
}