2010-04-12 95 views
33

我知道這是oops中一個非常基本的概念。但我仍然無法擺脫困境。我明白爲什麼成員變量是私人的,所以班級用戶不能通過設置無效值來濫用它。爲什麼面向對象中的「私有」方法?

但是這怎麼能適用於這些方法呢?

+2

防止程序員編寫在垂直方向永遠滾動的公共方法。您需要私有方法來將您的公共方法實現分解爲可讀/可維護/內聚/可重用(DRY)塊 - 理想情況下,每個塊都是私有方法,意圖顯示名稱。 – Gishu 2010-04-12 08:34:09

+1

感謝您的所有意見..我得到了答案,這是很久以來在我的腦海中。 Stackoverflow真的很有幫助。 – pointlesspolitics 2010-04-12 13:16:35

+0

重要的是要指出,大多數時候你可能實際上並不需要「私人」方法,而是一種「受保護」方法。 ([差異](https://stackoverflow.com/questions/224966/private-and-protected-members-c)) – rinogo 2018-01-26 18:55:05

回答

80

很好的答案的很多,但是從我通過一切隻身了很多痛苦的自學成才的Java程序員也許有更多;)

想想從外面看到一類的東西,而不是你在內部看到的東西。如果你從外面看課堂,你看到了什麼?

再次以時鐘爲例,一個時鐘可以給大家介紹當前時間信息,它可以是設置爲顯示正確的時間

所以從外面看,時鐘就是一臺可以做這兩件事的機器; 我們稱之爲公共方法

但是我們作爲這個時鐘的構造函數,我們知道在任何時間操作之前,我們必須在顯示器上將它從23切換到11(這就是那種時鐘),所以我們必須在內部重新安排一些東西來做到這一點。在這兩種情況下,從23變爲11對我們來說都很合適 - 設置時鐘並顯示當前時間 - 但是我們在「」一邊做「,因爲用戶不必知道所有那些複雜的數學。這些是私人方法!

所以我們Clock類可以有兩個公共方法showTimesetTime),這是所有用戶希望看到,而且這些公共方法提供功能的私有方法(recountTime)並且是用戶不希望看到的東西。

所以一方面,你應該記住,私人是將不會被未來的程序員使用你的代碼(正如在上面的答案中指出的)重新實現和訪問什麼。但私人也意味着做的事情,所以用戶看不到它。這就是爲什麼我們將公共方法稱爲公共接口 - 這是用戶從外部看到的所有內容。

對我來說,它是有幫助的(我是自學的,所以也許它不是一種非常受歡迎的方法...)寫下用戶(真實用戶和其他類)將使用我的類(公共接口只用公共方法的簽名),然後編寫私有方法的簽名,這些私有方法將用於實現承諾提供給我的用戶的公共目標,然後用代碼完成它。

請記住舊的C規則仍然有效(如97 Things Every Programmer Should Know中所示):函數/方法應該只有幾行,真是太棒了!

5

出於完全相同的原因 - 某些方法僅用於類內部,而非類對象的使用會被濫用。考慮增加和減少類的對象數量的方法 - 這些只能從類的構造函數或析構函數中調用,因此應該是私有的。

26

私有方法可用於將任務分解爲較小的部分,或用於防止類中其他方法經常需要的代碼重複,但不應在該類之外調用。

+0

我不太確定私有方法如何與破解任務或防止重複碼。我們在這裏討論的是方法範圍。 – 2010-04-13 21:36:21

+0

假設你有一組前置條件,你需要在你的類中調用各種方法或需要獲取的鎖之前驗證,或者確實有任何代碼塊可以用多種方法重複,但在外面沒有意義的類。這段代碼是放入私有方法的完美人選,完全是因爲它是重複的,在班級之外沒有意義。後一個原因是關於方法範圍。 – uckelman 2010-04-14 08:45:38

3

私有方法只能由同一個類中的方法或同一個「模塊」中的方法調用。方法通常不是私有的;通常他們被保護起來,以便孩子可以打電話給他們,或者公開給其他代碼打電話。

+0

「讓孩子們可以打電話給他們」 - 最佳答案IMO。 「私有」訪問修飾符使子類不能繼承方法/變量。這是私有和受保護的主要區別。 – l00k 2018-02-17 04:50:59

8

方法(也)用於構造代碼,我不希望我的實現的內部結構通過接口泄漏出去。通常我有一種方法可以讓外部看起來像完成一項任務,但實際上必須執行一些較小的任務。在這種情況下,我爲每個子任務創建一個小的私有方法,並使用公開可見的方法調用它們。

+0

我同意,並且我會說這也是擁有私有成員變量的主要原因。事實上,你可以驗證他們的任何改變,以避免無效的值,我認爲這是一個副產品。 – 2010-04-12 08:37:35

+0

可見性不是這種訪問修飾符的「私有」的主要特徵。 「受保護」也是公開訪問隱藏的。 – l00k 2018-02-17 04:47:16

2

那麼在某些情況下,您希望只有特定類才能使用某個方法,並防止其被任何其他類使用。

只是一個例子,以顯示它如何被使用:

你有一個類時鐘,它運行,並且運行跟蹤的時間和日期。您可以通過公共方法獲取時間或日期。但時鐘必須是正確的。所以你不能在課堂外調整時間或日期。但時鐘本身需要能夠調整時間(例如夏令時)

在這種情況下,時鐘將有一個私人方法來調整時間。

然後你還有一個額外的親,這是結構代碼。您可以將代碼拆分爲構成代碼的較小的私有方法,但是可以防止它們在課程之外使用。

1

記住所有其他答案。值得記住的是私人方法對於許多語言的程序員來說只是小費。在大多數情況下,仍然可以使用私有方法。例如,通過創建一個從具有私有方法的對象繼承的對象並用新的公共方法覆蓋其方法。

在一些現代高度面向對象的語言中,私有方法只能按照約定存在。以'_'開始的方法被認爲是私人的。

相關問題