2010-07-13 132 views
7

我总是怀疑是否可以有一个私人类?而且,这样的课程有什么意义?是否有可能有私人课程?

感谢您的帮助。

+0

[为什么/何时应该在.net中使用嵌套类?或者你不应该?](http://stackoverflow.com/questions/48872/why-when-should-you-use-nested-classes-in-net-or-shouldnt-you) – nawfal 2013-02-25 10:49:12

回答

19

是的,它可能有一个私有类,但只是作为一个内部类另一个类的:

public class Outer 
{ 
    private class Inner 
    {} 
} 

当你想封装一个类的内部的一些逻辑这通常是有用的(外一个),但需要更具结构化/ OO的代码设计来实现它。过去,当我需要一个容器类来处理某个类的方法中的某些信息时,我曾经使用过这种模式,但是容器类在这个逻辑之外没有任何意义。使容器类成为私有内部类意味着它的使用本地化为利用它的外部类。

值得注意的是,在这个结构中,内部类可以访问外部类的私有成员,但不能以其他方式访问。

+0

你可以使用它与NullObject模式(http://en.wikipedia.org/wiki/Null_Object_pattern),然后您的客户端类将永远不会知道还有其他类需要担心。 – 2010-07-13 08:54:32

2

是的,你可以 - 通常它们是嵌套在另一种类型内的类。这意味着您可以将逻辑聚合到嵌套类中,而不将类暴露给其他任何东西。内部对嵌套类也很有用。

但是请注意,对于需要嵌套类的设计有一些争论 - 我倾向于在看起来很合适时使用它们。

2

您可以在另一个班级内部拥有私人班级。

您可以使用私有类来封装逻辑和实现。例如,你可以在你的ICollection的实现中声明一个迭代器的实现。

3

拥有私有的非嵌套类(仅对其名称空间和子名称空间仅可见)将允许在编写同一程序集时清除代码边界。

例如,只有一个接口和一个工厂可以从同一个程序集中的其他名称空间中看到,同时仍然具有接口和实用程序类的所有实现(那些没有人知道名称空间的业务)。

它仍然可以用一个大的部分类来替代名字空间和嵌套类,但这是一个非常糟糕的黑客攻击,单元测试几乎是不可能的。

+0

用于命名空间注释。 – 2010-07-13 08:29:44

+0

这个答案与你的前两行矛盾:http://stackoverflow.com/a/6776502/733152,你能清除混淆吗? ,谢谢 – 2012-01-14 15:50:41

+0

@Anubis先生请阅读问题。我回答了第二点,即如果私人类存在,特别是如果它们是名称空间私有的,那么私人类的用处是什么。由于我的第一行中的“会”表示此功能不在当前的C#规范中。 – 2012-01-14 23:50:43