2010-12-11 17 views
2

多分私は何かが不足していますが、C#にメソッドの外部アクセス修飾子を付けるべきではないでしょうか?つまり、メソッドをpublicにしますが、他のクラスに対してのみ、メソッドをクラス自体で呼び出すことはできません。「外部」アクセス修飾子がない理由は何ですか?

ロックがクラス内から再入されないようにするロックを行うパブリックメソッドのようなものには役に立ちませんか?

+0

'extern'キーワードがありますが、それはあなたが記述したものには使用されません。 http://msdn.microsoft.com/en-us/library/e59b22c5%28v=vs.80%29.aspx – Nobody

+9

これは、複数の人格障害を持つプログラマーにとって有用です。あるクラスからメソッドにアクセスできないようにするには、それらを別のクラスに配置します。設計上、oopクラスはそのクラスに含まれるメソッドとデータにアクセスして制御する必要があります。 – ja72

答えて

5

明示的な実装のインターフェイスメソッドは、おそらくあなたが望むものに最も近いものです。もちろん、クラスがインターフェイスタイプにthisをキャストすると、クラスはそれ自体を呼び出すことができます。

+0

実際、私は他の答えが良いと思います。私はあなたがこのような振る舞いを必要とすべきではないことについて暴言を起こすつもりでしたが、巧妙な解決策を思いつく誘惑は大きすぎました。 – siride

+0

[Progress](http://msdn.microsoft.com/en-us/library/hh193692.aspx)と[IProgress](http://msdn.microsoft.com/en-us/library/hh138298.aspx )インターフェイスは、これをうまく利用した本当に良い例です。 'IProgress .Report'はプライベートなメンバーなので、' Progress 'クラスを作成する人は' Report() 'メソッドを見ることはできませんが、' IProgress ' 'コールバックメソッド。 –

3

私はそれが役に立たないと思います。それに対する必要性を定義するパラダイムはありません。

例:externalキーワードがあっても、ロックを解放せずに外部から再入力できないようにするにはどうすればよいですか?

クラス間に契約があり、クラスは常にそれ自体と契約しています。私はそのようなプログラミングミスを避けるためにキーワードは役に立たないと思います。この特定の例では、クラスはその使用レベルに応じて適切にロックを実装する必要があります。

+0

私は、コードの意図を明確にし、ある種の動作を保証する構文は一般的に良いことだと思うので、readonlyキーワードのようなものがあります。クラスが自分自身と「契約」を結ぶことができない理由はありません – Homde

8

これは必要ありません。アクセス制御は、の信頼されていないクライアントコードからのメンバーへのアクセスを制限するために使用されます。

OOPでは、クラスは自立した自己完結型のコード単位を表し、暗黙のうちに自己一貫性があるとみなされます。

自分のクラスのコードを再入可能にしないと信じられない場合、あなたは何を信頼できますか?可能性のあるすべての事態を言語機能で守ることは実用的ではありません。時には自分のコードが動作することを確かめるために開発者としてあなたに任せていることがあります:)

関連する問題