2013-07-01 41 views
2

我正在做一個任務,要求我們爲矩形定義一個類併爲其配備各種方法,其中兩個是getHeight()getWidth(),這些方法不應該這樣做除return this.height;return this.width;之外的任何其他內容。我不明白這一點。如果我曾經想要訪問widthheight,爲什麼不通過引用this.width而不是this.getWidth()來做到這一點?getAttribute()方法的要點

+0

僅舉一個例子,或許你不想暴露'width'或'height',因爲你不想讓它們直接設置。 – apsillers

+3

參見封裝http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming) – erkanyildiz

+1

http://stackoverflow.com/questions/1568091/why-use-getters-and-setters 或 http:// stackoverflow.com/questions/10407877/what-is-the-point-of-getters-and-setters – projeqht

回答

10

重點是:將接口從實現中分離出來。

屬性getter和setter函數(getWidth()getHeight())是接口。實際變量this.widththis.height是實現。

只有界面對外界很重要,而不是執行。實現應該保持內部(數據封裝)。

在編寫一個類的雛形時,有時讓setter和getters成爲打字練習,但當類和它的接口變得更復雜時,通常會付出代價。一些IDE,如Eclipse for Java和C++,支持爲新數據成員生成樣板代碼。

對於非常簡單的類,分離似乎毫無意義,有時會省略getters和setters並授予直接訪問權限。一個例子是Point2d類,其成員xy

但是,只要對象變得更復雜,getters和setter就是個好主意。您稍後可以在不更改界面的情況下更改實施。例如,稍後您可以在對象寬度發生變化時通知其他實例。

getter的一個主要應用是在某些方面實現一個只讀接口:在這種情況下,只有一個getter方法,沒有setter,並且數據元素是私有的。通過這種方式,您可以防止使用該類的代碼意外更改值。

有些語言支持類的標記部分爲私人內部實施,無論是位置,或者通過與像private特殊關鍵字標記它們。

像Python這樣的其他語言並不明確支持這種嚴格的數據封裝,但它仍然可以通過在內部數據成員前加一個特定的前綴或後綴來實現(Python中雙或單下劃線,雙下劃線甚至破壞名稱有些)。

+0

「例如,您可以稍後在對象寬度發生變化時通知其他實例。」 +1就是爲了這個! –

5

這被稱爲information hiding,並有多種原因來利用它。例如,您通常不希望讓外部用戶訪問this.heightthis.width,因爲您不希望他或她直接修改它們(可能將它們設置爲無效值?)。一般來說,你想要隱藏數據如何存儲在你的類中,並且只允許通過你自己定義的方法進行訪問。

當然,有時你不需要擔心這一點;如果您的字段被聲明爲final例如,那麼它可能在某些情況下可以授予直接訪問權限。這可以在所有陣列中看到,所有陣列都有一個名爲lengthpublic final int字段。直接訪問final字段的更好方法是知道用戶永遠不能改變它。

此外,使用getter和setter會使您的代碼在未來更易於維護和更新。舉個例子,如果你想改變未來的身高報告怎麼辦?即如果它低於特定閾值則報告0。這是不可能的,如果人們已經直接訪問height字段。

4

圍繞這一點的基本原理是實現和類的使用(由類接口定義)之間的分離。如果強制類用戶通過「setter」和「getter」方法訪問類屬性,則以後可以在不更改接口的情況下更改這些屬性的實現方式。例如,屬性可以被計算而不是存儲,或者它們可以被存儲在數據庫中而不是存儲器變量等中,並且類的用戶不需要知道或關心。

相關問題