16

Javaでは、メソッドをオーバーライドすると、コンパイラーは可視性を絞り込もうとする試みをエラーとしてフラグ付けします。例:パブリックメソッドを保護されたものとしてオーバーライドすることはできませんが、保護されたメソッドをパブリックとしてオーバーライドすることはできます。

このルールの背後にある設計上の決定/思考を知ることに興味があります。

4

4 に答える 4

26

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.

于 2012-07-14T14:56:57.897 に答える
17

Bから継承するクラスを考えてみましょうAA.m()公開されています。次のコードを検討してください。

A obj = new B();
obj.m();

この呼び出しを許可する必要がありますか? はい、そうすべきです。 は!obj型のオブジェクトだからです。Aそれは type のオブジェクトでもありますが、それはオブジェクトBを使用する人に必ずしも知られているわけではありません。

type のすべてのオブジェクトはA、 の契約 (インターフェース) に準拠する必要がありますABしたがってA、その契約にも従わなければなりません。

于 2012-07-14T14:54:18.323 に答える
5

アクセス レベルを削除または実装している間は、同じアクセス レベルまたはそのアクセス レベルよりも広いアクセス レベルを使用する必要があります。

private < (default) < protected < public

パブリックは最も広いレベルです。

インターフェイスでは、すべてのメンバーがデフォルトのパブリックです。そのため、実装またはオーバーライドしている間は、パブリックのみを使用する必要があります。

于 2012-07-14T16:51:14.467 に答える