2010-07-13 94 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

相關問題