我不是编程的新手,但我总是对一些关于OOP的基本概念感到困惑。目前我正在使用C#开发,我想知道 WHY和WHEN(或者如果不可能)使用以下组合?
特别是对于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 :(得分: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();
}
}