サブクラスでメソッドをオーバーライドしているときにメソッドの可視性を下げると、コンパイラがエラーメッセージを表示するのはなぜですか?
12504 次
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 に答える