2012-07-14 5 views
9

Javaでは、メソッドをオーバーライドすると、コンパイラは可視性をエラーとして絞り込みます。例えば、パブリックメソッドをprotectedとしてオーバーライドすることはできませんが、protectedメソッドをパブリックメソッドとしてオーバーライドすることはできます。オーバーライド中にメソッドのスコープを絞り込むことができないのはなぜですか?

私はこのルールの背後にある意思決定/思考を知ることに興味があります。

+0

この質問は数日前に聞かれましたが、何がポイントですか? –

+1

http://stackoverflow.com/q/11343763/1475461先週号で問題になっていたディスカッションのためにこれを見てください –

答えて

14

サブクラスは、常にスーパークラスの契約を満たす必要があります。 Liskov Substitution principleを参照してください。

メソッドの可視性は、この契約の一部です。したがって、スーパークラスで公開されているものは、サブクラスでも公開されている必要があります。

+1

SOLID答え....! –

14

Aを継承するクラスBを考えてみましょう。 A.m()は一般公開されています。今度は次のコードを考えてみましょう:

A obj = new B(); 
obj.m(); 

この呼び出しが許可されるべきですか?はい、それはobjAタイプのオブジェクトであるためです。タイプBのオブジェクトでもありますが、オブジェクトを使用するオブジェクトには必ずしも知られているわけではありません。

タイプAのすべてのオブジェクトは、Aの契約(インタフェース)に準拠している必要があります。 BAに拡張されているため、その契約も遵守しなければなりません。

3

アクセスレベルを削除または実装している間は、同じアクセスレベル以上のアクセスレベルにする必要があります。

private < (default) < protected < public 

パブリックは最も広いです。

インターフェイスでは、すべてのメンバーがデフォルト公開されています。だから、私たちは遂行しているか、または荒廃している間、私たちは公衆のためだけに行きます

関連する問題