サブクラスがスーパークラスの属性にアクセスする(つまり、属性をプライベートとして設定する)ために、スーパークラスにゲッターとセッターを提供することはまだ標準的な方法ですか?または、サブクラスによって属性に直接アクセスする(属性を保護として宣言する)必要がありますか?スーパークラスのゲッターとセッター?
標準的な規約がありますか?
サブクラスがスーパークラスの属性にアクセスする(つまり、属性をプライベートとして設定する)ために、スーパークラスにゲッターとセッターを提供することはまだ標準的な方法ですか?または、サブクラスによって属性に直接アクセスする(属性を保護として宣言する)必要がありますか?スーパークラスのゲッターとセッター?
標準的な規約がありますか?
私はCSの学位を取得する大学にいたとき、2年目にゲッターやセッターをしないで5年目にやっていると言われました。
私の個人的な好みは、ゲッターとセッターを絶対に必要とする場所と決してパブリック変数を持たない場所で使うことです。
これは、あなたが達成したいことに完全に依存します。
継承されずにスーパークラス属性にアクセスできるようにするには、パブリックゲッターとセッターを宣言する必要があります。
スーパークラスが継承されている場合にのみメンバーにアクセスできるようにする場合は、保護されたメンバーを宣言する必要があります。
何らかの検証が必要な場合は、ゲッターとセッターが必要です。これにより、スーパークラスが継承されていても、不注意な破損からスーパークラスが保護されます。
チェックこの質問へのトップ2つの答え:
Are getters and setters poor design? Contradictory advice seen
あなたの質問にない偉大な答えが、あなたは彼らにいくつかの考えを与える必要がありますので良いOOをコーディングすると、明らかに懸念しています。
Javaでは、すべてのフィールドを非公開にすることをお勧めします。私が実際に何かを公開する必要がある場合、私はフィールドのための別の保護されたゲッターを作成します。 (例えば、私が実装しているインターフェースが、さまざまなレベルの実装間で渡したいものより広い戻り値タイプを必要とする場合)
マウスのクリックでゲッター/セッターを生成するツールでは、親子クラス間でもカプセル化を破る必要があると感じました。
データメンバ(フィールドまたはプロパティ)がパブリックではありませんが、子クラスにとって有益で、読み書きの両方が可能な場合は、そのメンバをprotectedとして宣言します。
メンバーは、あなたが保護されてプロパティとしてではなく、民間のセッターでメンバーを定義することができ、サブクラスによって読まなく、書かれてはいけない場合は、次の
//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には、読み取りと書き込みのアクセスの可視性を個別に制御できるメソッドがあります。
C#では、get/setアクセサでプロパティを使用するのが標準的な方法です。あなたが持っているでしょう簡略化した形で :
public string Name { get; set; }
しかし、あなたは、たとえば、アクセスレベルをより細かく制御を持っていることがあります。
public string Name { get; protected set; }
ここでは、公にgetメソッドを公開するが、セットを残しますメソッドを派生クラスに限定しています。
データメンバーに直接アクセスする代わりにアクセサーを使用するもう1つの利点は、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と同じ概念を反映しても安全です。
どの言語で? C#とJavaには、値を公開するためのさまざまな構成が用意されています。どちらの言語でもこれを行う方法に影響する可能性があります。 – KeithS
重複:http://stackoverflow.com/questions/2279662/java-protected-fields-vs-public-getters –
およびhttp://stackoverflow.com/questions/3525765 –