サブクラスでメソッドをオーバーライドしているときにメソッドの可視性を下げると、コンパイラがエラーメッセージを表示するのはなぜですか?
サブクラスのすべてのインスタンスは、基本クラスの有効なインスタンスである必要があるためです( リスコフの置換原則 を参照)。
サブクラスが突然基本クラスの1つのプロパティ(つまり、パブリックメソッドなど)を失った場合、それは基本クラスの有効な代替ではなくなります。
これが許可された場合、次の状況が発生する可能性があるためです。
クラスSubはクラスParentから継承します。親にはパブリックメソッドfoo
があり、サブはそのメソッドをプライベートにします。 bar
の宣言されたタイプは親であるため、次のコードは正常にコンパイルされます。
Parent bar = new Sub();
bar.foo();
ただし、これがどのように動作するかは明確ではありません。 1つの可能性は、ランタイムエラーを引き起こすことです。もう1つは、単純に許可することです。これにより、親クラスにキャストするだけで、外部からプライベートメソッドを呼び出すことができます。これらの選択肢はどちらも受け入れられないため、許可されていません。
サブタイプはスーパータイプのインスタンスとして使用できる必要があるためです。