Javaでは、メソッドをオーバーライドすると、コンパイラは可視性をエラーとして絞り込みます。例えば、パブリックメソッドをprotectedとしてオーバーライドすることはできませんが、protectedメソッドをパブリックメソッドとしてオーバーライドすることはできます。オーバーライド中にメソッドのスコープを絞り込むことができないのはなぜですか?
私はこのルールの背後にある意思決定/思考を知ることに興味があります。
Javaでは、メソッドをオーバーライドすると、コンパイラは可視性をエラーとして絞り込みます。例えば、パブリックメソッドをprotectedとしてオーバーライドすることはできませんが、protectedメソッドをパブリックメソッドとしてオーバーライドすることはできます。オーバーライド中にメソッドのスコープを絞り込むことができないのはなぜですか?
私はこのルールの背後にある意思決定/思考を知ることに興味があります。
サブクラスは、常にスーパークラスの契約を満たす必要があります。 Liskov Substitution principleを参照してください。
メソッドの可視性は、この契約の一部です。したがって、スーパークラスで公開されているものは、サブクラスでも公開されている必要があります。
SOLID答え....! –
A
を継承するクラスB
を考えてみましょう。 A.m()
は一般公開されています。今度は次のコードを考えてみましょう:
A obj = new B();
obj.m();
この呼び出しが許可されるべきですか?はい、それはobj
がA
タイプのオブジェクトであるためです。タイプB
のオブジェクトでもありますが、オブジェクトを使用するオブジェクトには必ずしも知られているわけではありません。
タイプA
のすべてのオブジェクトは、A
の契約(インタフェース)に準拠している必要があります。 B
はA
に拡張されているため、その契約も遵守しなければなりません。
アクセスレベルを削除または実装している間は、同じアクセスレベル以上のアクセスレベルにする必要があります。
private < (default) < protected < public
パブリックは最も広いです。
インターフェイスでは、すべてのメンバーがデフォルト公開されています。だから、私たちは遂行しているか、または荒廃している間、私たちは公衆のためだけに行きます
この質問は数日前に聞かれましたが、何がポイントですか? –
http://stackoverflow.com/q/11343763/1475461先週号で問題になっていたディスカッションのためにこれを見てください –