Javaでは、メソッドをオーバーライドすると、コンパイラーは可視性を絞り込もうとする試みをエラーとしてフラグ付けします。例:パブリックメソッドを保護されたものとしてオーバーライドすることはできませんが、保護されたメソッドをパブリックとしてオーバーライドすることはできます。
このルールの背後にある設計上の決定/思考を知ることに興味があります。
Javaでは、メソッドをオーバーライドすると、コンパイラーは可視性を絞り込もうとする試みをエラーとしてフラグ付けします。例:パブリックメソッドを保護されたものとしてオーバーライドすることはできませんが、保護されたメソッドをパブリックとしてオーバーライドすることはできます。
このルールの背後にある設計上の決定/思考を知ることに興味があります。
A subclass should always satisfy the contract of the superclass. See Liskov Substitution principle.
The visibility of methods is part of this contract. So anything publicly visible in the superclass should be public in the subclass as well.
B
から継承するクラスを考えてみましょうA
。A.m()
公開されています。次のコードを検討してください。
A obj = new B();
obj.m();
この呼び出しを許可する必要がありますか? はい、そうすべきです。 は!obj
型のオブジェクトだからです。A
それは type のオブジェクトでもありますが、それはオブジェクトB
を使用する人に必ずしも知られているわけではありません。
type のすべてのオブジェクトはA
、 の契約 (インターフェース) に準拠する必要がありますA
。B
したがってA
、その契約にも従わなければなりません。
アクセス レベルを削除または実装している間は、同じアクセス レベルまたはそのアクセス レベルよりも広いアクセス レベルを使用する必要があります。
private < (default) < protected < public
パブリックは最も広いレベルです。
インターフェイスでは、すべてのメンバーがデフォルトのパブリックです。そのため、実装またはオーバーライドしている間は、パブリックのみを使用する必要があります。