42

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

4

3 に答える 3

65

サブクラスのすべてのインスタンスは、基本クラスの有効なインスタンスである必要があるためです(リスコフの置換原則を参照)。

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

于 2009-10-21T12:59:53.093 に答える
18

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

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

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

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

于 2009-10-21T13:04:35.700 に答える
1

サブタイプはスーパータイプのインスタンスとして使用できる必要があるためです。

于 2009-10-21T13:01:48.957 に答える