2010-05-25 122 views
5

以下是有關在課堂上使用屬性的問題。屬性和封裝

我一直在使用公共屬性,而不是公開暴露成員變量。多數人建議這種方法有助於封裝。但是,我不明白封裝的優勢,因爲它是一個屬性。

很多人不知道使用屬性的真正原因。他們只是將它作爲編碼標準的一部分。

有人可以清楚地解釋一個屬性如何比公共成員變量更好,以及它如何改進封裝?

回答

6

封裝有助於通過絕緣來改變類的調用。讓我們想象一下,你有一個簡單的類來模擬汽車引擎(導致所有的OO例子應該涉及汽車的比喻:))。你可能有一個簡單的現場是這樣的:

private bool engineRunning; 

簡單地使這一領域的公共或提供一個類型的字段()的吸氣劑不出現任何不同。

現在假設你讓你的類更復雜,要刪除字段,將其替換爲:

private bool ignitionOn; 
private bool starterWasActivated; 

現在,如果你有大量的類來訪問老engineRunning領域,你必須去改變他們所有(不好的時候)。

相反,如果你已經開始:

public bool IsEngineRunning() 
{ 
    return this.engineRunning; 
} 

你現在可以將其更改爲:

public bool IsEngineRunning() 
{ 
    return ignitionOn && starterWasActivated; 
} 

和類的接口保持不變(美好的時光)。

+0

我想指出的是,這種變化並不意味着客戶端必須改變。它只意味着你必須以同樣的方式和相同的語義暴露engineRunning屬性。唯一的區別是每次更新點火和起動器屬性都必須更新engineRunning屬性。取決於更頻繁地閱讀/更新的內容,這可能會對性能產生正面或負面影響。 – 2013-02-23 08:29:39

1

的幾點思考:

  • 你可以改變你的數據的內部表示,而不會影響調用的類。

    E.g. (前)

    public boolean isActive() { 
        return this.is_active; 
    } 
    

    (後)

    public boolean isActive() { 
        return this.is_active && this.approved && this.beforeDeadline; 
    } 
    

    如果你的代碼是由他人使用(即你的代碼是第三方)這一點尤其重要。在一定程度上,你的界面/ API必須保持穩定。小的更改不應該影響使用它的其他代碼的代碼。

  • 您可以有更復雜的操作。考慮一個變量is_active。也許改變這個變量的值也會影響對象的其他屬性。如果你將訪問封裝在一個方法中,你可以在這個方法中關注這個,並且調用者不必關心。

    E.g.

    public void setActive(boolean active) { 
        this.is_active = active; 
        this.startTimeout(); 
        this.updateOtherInformation(); 
    } 
    

    因此它強制執行一系列的操作。你不要已經依靠調用者正確執行此操作的事實。你的對象將始終處於正確的狀態。

2

我會把它縮短。屬性=靈活性

屬性可用於創建您不希望在課程中始終保持的成員,或者是現有成員的聚合/功能。

例如,年齡可以根據生日輸出,可以從hasLimbs & &生成canSwim漂浮

揭露成員性質與意外變化打交道時能有所幫助[有沒有人曾預測所有客戶機的請求?]在一個系統現有數據庫。

例如,當用戶超過18歲並被高速緩存以獲得性能時,它是真實的。客戶端要運行在美國的服務,如果假的chached可以返回false,檢查年齡只有當緩存爲真

4

其更好地揭露性質的,而不是成員變量,因爲這將讓你做各種檢查何時設置或獲取成員變量的值。

假設u有一個成員變量:

private int id; 

,你有一個公共財產:

public int ID 
{ 
    get 
    { 
     // do something before returning 
    } 
    set 
    { 
     // do some checking here may be limits or other kind of checking 
    } 
}