2012-09-13 6 views
5

JavaとC#のアクセス修飾子を比較していました。私はJavaでC#のprotected internalの代替案を探したかったのです。しかし、protected修飾子が両方の言語(C#Java)で異なることに気付きました。 JavaのprotectedはC#のprotected internalに相当します。なぜなら、メンバは同じパッケージ内でアクセスできるからです。JavaとC#のアクセス指定子に関する混乱

彼らはJavaやC#で同じ修飾子に異なる意味を作成しているのはなぜ私は2つの質問

  • がありますか?
  • C#のprotectedを持つにはどうすればいいですか()Javaでのアクセスは、含まれているクラスまたはそれを含むクラスから派生したものに限定されますか?

答えて

2

彼らは同じJavaでの修飾と のC#に異なる意味を作成しているのはなぜ?

単純さと異なるアクセス権を正確に指定する能力の間で選択する必要がありました。 Javaの作成者とC#の作成者によって異なる選択が行われました。

どのように私は(アクセスは含む クラスまたは含むクラスから派生したタイプに制限されている。)JavaでC#で保護されていることができますか?

できません。 Javaはこの点でより制限されています。

protectedキーワードは、両方の用途が一般的なカプセル化原則の破棄を意味するため、おそらく制限する必要があります。あまりにも厳格な言語はあまりにも多くの無駄なコードを意味する可能性がありますが、あまりにも結びすぎて変更や維持が困難なものを作らないように注意してください。クラスをオーバーライドするための内部フィールドやメソッドにアクセスすると、実装の結合が大きすぎる重い階層があることがよくあります。

アクセス制御修飾子なしで宣言された変数またはメソッドは、同じパッケージ内の他のクラスで使用できることに注意してください。私の意見では、それはどんなパッケージのサブクラスによるアクセスも許可するよりも安全です。

Here's the complete grid:JavaのAPIドキュメントで

enter image description here

+0

"あまりにも結びつきすぎて変更や維持が難しいことに注意してください"。理解できませんでした。修飾子はどのようにその役割を果たしていますか? – Shashwat

+0

内部フィールドにアクセスするサブクラスがある場合、スーパークラスの実装を変更することを強要します。これは、カプセル化が回避に役立つ問題の1つです。 –

+0

入手しました。ありがとう:) – Shashwat

0

、キーワードアクセス指定子はSun.comによって提供されていません。この例を試してみてください

D:\>javac Demo.java 
Demo.java:1: error: **modifier** private not allowed here 
private class Test 
     ^
1 error