簡體   English   中英

超類的獲取器和設置器?

[英]getters and setters for superclasses?

在超類中提供獲取器和設置器,以使子類訪問超類的屬性(換句話說,將屬性設置為私有)仍然是標准做法嗎? 還是應該由子類直接訪問屬性(將屬性聲明為受保護的)?

有標准慣例嗎?

這完全取決於您要完成什么。

如果希望超類屬性可以訪問而不被繼承,則需要聲明公共getter和setter。

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

如果您需要某種形式的驗證,則需要使用getter和setter。 這樣可以保護超類免受意外損壞,即使它是繼承的也是如此。

當我在大學攻讀計算機科學學位時,我們被告知不要在第二年做吸氣器和安裝器,而在第五年做。

我個人的喜好是僅在絕對需要的地方使用getter和setter,並且永遠不要使用公共變量。

檢查此問題的前兩個答案:

吸氣器和吸氣器設計不佳嗎? 看到矛盾的建議

對您的問題來說,這不是一個很好的答案,但是您顯然對編寫好的OO感到擔心,因此您應該考慮一下。

在Java中,我傾向於將所有字段設為私有。 如果確實需要公開某些內容,則可以為該字段創建一個單獨的受保護的吸氣劑。 (例如,如果我要實現的接口要求的返回類型比我想要在不同級別的實現之間傳遞的接口更大的返回類型。)

借助可通過單擊鼠標生成吸氣劑/塞特劑的工具,我什至從未感到需要打破封裝,即使在父/子類之間也是如此。

說到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方法和private setter方法的私有字段。

通常,作為超類的設計者,您需要定義子類應如何使用所提供的內容。 如果您將某些內容設為受保護的,則假定子類將執行“受保護”允許它們執行的所有操作。 C#和Java都具有您可以獨立控制讀寫訪問可見性的方法。

似乎在C#中,標准做法是將屬性與get / set訪問器一起使用。 以簡化形式,您將擁有:

public string Name { get; set; }

但是您可以更好地控制訪問級別,例如:

public string Name { get; protected set; }

在這里,您公開公開了get方法,但是將set方法僅留給派生類。

使用訪問器而不是直接訪問數據成員的另一個好處是,您可以在get / set方法上設置一個斷點,並查看誰執行了該方法。
但是,使用{ get; set; } { 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的相同概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM