2012-03-19 7 views
0

は、私は、次のコードを持っている:Bookクラスが弱くアクセス修飾子と夕食クラスの関数をオーバーライドしようとしているので、弱いオーバーライドされた関数がJavaでは使えないのはなぜですか?

public class Library { 

    public void myFunction() { 
     // do something 
    } 
} 
public class Book extends Library{ 

    protected void myFunction() { // Error here 
     // do something 
    } 

} 

上記のコードは、エラーが発生しました。私はこれがJavaのルールだと知っています。しかし、私はなぜそれが好奇心ですか?どのような問題が引き起こす可能性がありますか?

答えて

5

は全く異なるパッケージから、考えてみましょう:

new Book().myFunction()    // clearly, no access 

((Library)new Book()).myFunction() // now ... access? 

問題は本当にダウンmyFunction仮想であることに来ます。呼び出されるメソッドはランタイムタイプに依存し、式の静的タイプに依存しません。 (私はC#が実際にはnew修飾子を使った非仮想メソッドに対してこれを許可すると信じています)。

0

確かに、ライブラリを与えられた人がいればmyFunctionと呼ぶことになっています。

したがって、Library test = getALibraryObject();のような本を返すと、その方法は一部のオブジェクトでは保護されず、他のオブジェクトでは保護されないことがわかります。

0

あなたの例は、本がライブラリではないのでちょっと離れています。しかし、車とトラックを考えてみましょう。

public class Car { 
    public start() {} 
} 

public class Truck extends Car { 
    protected start() {} 
} 

Car c = new Truck(); // should be possible yes? 
c.start(); // this is why you cannot change access modifiers in sub classes 
0

のはBookのインスタンスで初期化されReader

public class Reader { 
    private final Library library; 

    public Reader(Library library) { 
    this.library = library; 
    } 

    public void read() { 
    library.read(); 
    } 
} 

クラスがあることを言ってみましょう:

Reader reader = new Reader(new Book()); 

その後、読者が読むことができないだろうそのreadメソッドはReaderのコンテキストでは表示されないためReaderLibraryreadメソッドにアクセスできますが、Bookreadメソッドにアクセスすることはできません。これはかなり奇妙ですね。

-1

オブジェクト指向言語のルールです。 オーバーライドされたメソッドのアクセス制御をバインドできません。 オーバーライドされたメソッドが保護されている場合は、パブリックとしてオーバーライドできますが、逆もできません。

+0

'オブジェクト指向言語'のルールではありません。 OOとはまったく関係がありません。もともと指定されたセキュリティは覆い隠されるべきではないという基本原則です。 – EJP

+0

原則とルールの違いは何ですか? –

+0

EJPによると、オブジェクト指向とは何の関係もありません。また、pstが言うように、C#では "新しい"キーワードを使って同様のことを行うことができます。そしてC#もオブジェクト指向です。 – Christian

関連する問題