使用public,private,protected和class / variable组合的原因?

时间:2015-09-18 01:15:48

标签: c# asp.net oop

我不是编程的新手,但我总是对一些关于OOP的基本概念感到困惑。目前我正在使用C#开发,我想知道 WHY和WHEN(或者如果不可能)使用以下组合?

  1. 有私人/受保护成员的公共类< ---(编辑:这是愚蠢的,忽略这一点)
  2. 私人/受保护类与公共成员
  3. 特别是对于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类,内部的成员也不应该公开......

2 个答案:

答案 0 :(得分:2)

让我们看一些例子,首先是私人/受保护成员的公共类:

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
    }
}

此处,所有这些类调用在内部都有效,但PrivateMethod以外的任何内容都不会显示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允许您创建仅对直接类可见的方法,而不包含其他内容。 Protected允许您创建内部可见的方法,并且对从中派生的任何类都可见。

现在让我们看一下私人课程:

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()在嵌套类的实现之外是不可见的。

这对于在课堂之外没有任何意义的内部数据结构非常有用。

答案 1 :(得分: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();
    }
}