Javaサブクラスのメソッドの可視性を下げることができないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1600667

質問

サブクラスでメソッドをオーバーライドしているときにメソッドの可視性を低下させると、コンパイラがエラーメッセージを表示するのはなぜですか?

役に立ちましたか?

解決

サブクラスのすべてのインスタンスは基本クラスの有効なインスタンスである必要があるため( Liskov置換の原則を参照してください)。

サブクラスが突然基底クラスの1つのプロパティ(たとえば、パブリックメソッド)を失った場合、基底クラスの有効な代替ではなくなります。

他のヒント

これが許可されている場合、次の状況が発生する可能性があるため:

Class Subは、Parentクラスを継承します。親にはパブリックメソッド foo があり、Subはそのメソッドをプライベートにします。次のコードは、 bar の宣言されたタイプがParentであるため、正常にコンパイルされます。

Parent bar = new Sub();
bar.foo();

ただし、これがどのように動作するかは明確ではありません。 1つの可能性は、実行時エラーを発生させることです。別の方法は、単純に許可することです。これにより、親クラスにキャストするだけで、外部からプライベートメソッドを呼び出すことができます。これらの選択肢はいずれも受け入れられないため、許可されません。

サブタイプはスーパータイプのインスタンスとして使用可能でなければならないため。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top