4

サブクラスがこれらの変数にアクセスできるように、基本クラスのメンバー変数を保護に設定することをお勧めしますか? それとも、メンバー変数をプライベートに設定し、サブクラスがゲッターとセッターによって変数を取得または設定できるようにすることをお勧めしますか?

また、getter メソッドと setters メソッドの使用が推奨されている場合、保護された変数はいつ使用されますか?

4

4 に答える 4

14

これは、プロパティを介して同じクラス内の情報にアクセスするか、直接アクセスするかに関するこの質問と非常によく似ています。おそらく、これらすべての回答も読む価値があります。

個人的には、(const かどうかに関係なく) 不変の値を持つ静的な読み取り専用フィールドを時折例外として非プライベートにするフィールドは好きではありません。私にとって、プロパティはカプセル化の度合いを高めるだけです。データの保存方法は、(プロパティとは異なり) APIの決定ではなく、実装の決定です。クラス Bar から派生したクラス Foo がクラス Bar の実装を気にする必要があるのはなぜですか?

要するに、私は常にプロパティを使用し、使い捨てのテスト コード以外には保護された変数を使用しません。

C# 3.0 で自動的に実装されたプロパティにより、フィールドをプロパティに変換することがこれまでになく簡単になりました。それをしない貴重な理由はほとんどありません。

于 2008-12-12T13:31:33.657 に答える
2

他のアセンブリのクラスは、封印されていないクラスから派生でき、保護されたフィールドにアクセスできます。これらのフィールドをプロパティにすることにした場合は、アセンブリの新しいバージョンで動作するように、他のアセンブリのクラスを再コンパイルする必要があります。これは「バイナリ互換性の破壊」と呼ばれ、アセンブリの外部にフィールドを公開してはならない 1 つの確かな理由です。

于 2008-12-12T13:41:58.363 に答える
0

これはトレードオフです。セッターとゲッターは、フィールドに直接アクセスするよりもやや遅いため、重い計算を行い、サブクラスでこれらのフィールドを頻繁に読み書きする場合は、フィールドに直接アクセスする必要があります。しかし、これは例外のようなものです。

通常、それらをプライベートとしてマークし、ゲッター/セッターを使用する必要があります。

したがって、私の答えは、使用頻度の高いフィールド、ゲッター/セッターへの直接アクセスです。常識を働かせてください。

編集: 私はいくつかのプロファイリングを行いましたが、どうやらリリース モードでも、フィールドとプロパティの間に最大 20% の速度差がある可能性があります。ここで私のテストケースを参照してください:http://pastebin.com/m5a4d1597

于 2008-12-12T13:35:15.927 に答える
0

私はジョンに同意しなければなりません。

しかし、ある条件で「最上位」の継承クラスに保護された変数を使用することがあります。たとえば、読み取り専用のオブジェクトがあり、それを子クラスで使用できるように戻すことができない場合、その変数にアクセスするために保護された Get が必要な理由がわかりません。単純な保護された変数は、この変数を設定できず、子クラスからのみこの変数にアクセスできるため、同じカプセル化を行います。

しかし、set/get は他の状況で行う方法です。

于 2008-12-12T13:46:25.470 に答える