2012-02-22 108 views
0

在超類中提供getter和setter是否仍然是標準做法,子類可以訪問超類的屬性(換言之,將屬性設置爲私有)?還是應該由子類直接訪問屬性(將屬性聲明爲受保護的)?超類的吸氣和吸氣?

是否有標準約定?

+0

用什麼語言? C#和Java有不同的可用結構來公開值,這可能會影響你如何在兩種語言中執行此操作。 – KeithS 2012-02-22 00:39:24

+0

Duplicate:http://stackoverflow.com/questions/2279662/java-protected-fields-vs-public-getters – 2012-02-22 00:41:51

+0

和http://stackoverflow.com/questions/3525765 – 2012-02-22 00:46:08

回答

0

當我在大學攻讀我的CS學位時,我們被告知第二年不要做吸氣劑和二次吸收劑,並且要在第五年做。

我個人的偏好是在絕對需要的地方使用getter和setter,永遠不會有公共變量。

1

這完全取決於你想完成什麼。

如果您希望超類屬性可以在不被繼承的情況下訪問,那麼您需要聲明公共getter和setter。

另一方面,如果您希望僅當超類繼承時才能訪問成員,則需要聲明受保護的成員。

如果你想要某種形式的驗證,你需要getters和setter。這可以保護超類免受無意的腐敗,即使它是被遺傳的。

0

在Java中,我寧願將所有的字段設置爲私有的。如果我真的需要揭露某些東西,我會爲該領域創建一個單獨的受保護的獲得者。 (例如,如果我正在實現的接口需要比我想要在不同級別的實現之間傳遞的更寬的返回類型)。

使用只需單擊鼠標即可生成getters/setters的工具,我從不覺得有必要打破父母/孩子班級之間的封裝。

0

說到C#端,如果您有一個數據成員(字段或屬性)不是公有的,但對子類有用並且應該可用於讀取和寫入,則將該成員聲明爲受保護的。

如果成員應該由子類可讀不可寫,你可以定義成員作爲被保護的財產,但有私人二傳手:

//as of C# 3.0 this can also be an auto-property 
private string myValue; 
protected string MyValue 
{ 
    get{return myValue;} 
    private set{myValue = value;} 
} 

這使得myvalue的從班完全隱藏繼承外層次結構,只讀子類;只有超類本身可以設置該值。這將相當於具有受保護的getter方法和私有setter方法的私有字段。

一般來說,作爲超類的設計者,由您決定子類應該如何使用您提供的內容。如果你做了一些保護,假設子類將做任何「保護」允許他們做的事情。 C#和Java都有可以獨立控制讀取和寫入訪問的可見性的方法。

0

似乎在C#中,標準做法是使用get/set訪問器的屬性。 在簡化的形式你必須:

public string Name { get; set; } 

但是你可能有過的訪問級別更精細的控制,例如:

public string Name { get; protected set; } 

在這裏,您公開暴露get方法,但離開集方法僅派生類。

使用訪問器而不是直接訪問數據成員的另一個好處是可以在get/set方法上放置一個斷點並查看誰執行了該方法。
然而,這是不可能的,{ get; set; }的伎倆。您必須編寫整個擴展屬性表單:

private string m_Name = string.Empty; 
public string Name 
{ 
    get { return m_Name; } // Put a happy breakpoint here 
    set { m_Name = value; } // or here. 
} 

對Java反映相同的概念將是安全的。