私は検索して理論的な違いを知っています。
- 公共- どのクラス/関数でもメソッド/プロパティにアクセスできます。
- 保護された- このクラスとそのサブクラスのみがメソッド/プロパティにアクセスできます。
- プライベート- このクラスのみがメソッド/プロパティにアクセスできます。継承もされません。
それはそれでいいのですが、問題は、実用的それらの違いは何ですか? いつ を使用しprivate
、いつ を使用しますかprotected
? これよりも標準的な、または許容される優れたプラクティスはありますか?
これまで、継承とポリモーフィズムの概念を維持するために、public
外部からアクセスする必要があるもの (コンストラクターやメインクラスの機能など) とprotected
内部メソッド (ロジック、ヘルパー メソッドなど) には を使用しました。正しい方向に進んでいるでしょうか?
(この質問は私宛ですが、このような質問は見たことがないので、今後の参考用でもあることに注意してください)。
ベストアンサー1
いいえ、それは間違いです。経験則として、すべてを可能な限りプライベートにしてください。これにより、クラスがさらにカプセル化され、クラスを使用しているコードに影響を与えずにクラスの内部を変更できるようになります。
クラスを継承可能に設計する場合は、オーバーライド可能でサブクラスからアクセス可能なものを慎重に選択し、それを保護します (アクセス可能だがオーバーライド不可にしたい場合は、Java で言えば final にします)。ただし、クラスのサブクラスを受け入れるとすぐに、保護されたフィールドまたはメソッドが存在する場合、このフィールドまたはメソッドはクラスのパブリック API の一部となり、サブクラスを壊さずに後で変更できなくなることに注意してください。
継承を意図していないクラスは、final にする必要があります (Java の場合)。ユニット テストのために、一部のアクセス ルール (private から protected、final から non-final) を緩和することもできますが、その場合はそれをドキュメント化し、メソッドが protected であってもオーバーライドされてはならないことを明確にします。