2012-03-19 2 views
0

나는 다음과 같은 코드를 가지고 : Book 클래스는 약한 액세스 한정자와 함께 저녁 식사 클래스의 함수를 재정의하려고하기 때문에Java에서 약한 대체 함수가 허용되지 않는 이유는 무엇입니까?

public class Library { 

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

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

} 

위의 코드는 오류가 있습니다. 나는 이것이 자바의 규칙이라는 것을 알고있다. 그러나 나는 왜 그런지 궁금하다. 어떤 문제가 발생할 수 있습니까?

답변

5

는 완전히 다른 패키지에서, 고려 :

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

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

문제는 정말 myFunction가상 인에 온다; 호출 된 메소드는 런타임 유형에 따라 달라지며 표현식의 정적 유형이 아닙니다. (나는 C#이 사실상 new 수식어를 사용하는 비 가상 메서드에 대해 이것을 허용한다고 생각합니다.)

0

확실히 일부 라이브러리가 제공되는 경우 myFunction을 공개로 서명해야하므로 서명해야합니다.

따라서 Library test = getALibraryObject();과 같은 책을 반납하면 일부 오브젝트에서는 메소드를 보호 할 수없고 다른 오브젝트에서는 보호 할 수없는 것으로 나타납니다.

0

귀하의 예제는 책이 라이브러리가 아니기 때문에 약간 떨어져 있습니다. 그러나 자동차와 트럭을 고려해 봅시다.

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

그런 다음, 독자가 읽을 수없는 것 :

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(); 
    } 
} 

가 있다고 가정 해 봅시다 책의 read 메서드는 Reader의 컨텍스트에서 볼 수 없으므로 ReaderLibraryread 메서드에 액세스 할 수 있지만 Bookread 메서드에 액세스 할 수 없습니다. 매우 이상합니다.

-1

이것은 객체 지향 언어의 규칙입니다. 오버라이드 된 메소드의 액세스 제어를 바인드 할 수 없습니다. 재정의 된 메서드가 protected 인 경우 public으로 재정의 할 수 있지만 그 반대의 경우는 적용 할 수 없습니다.

+0

'Object-Oriented Language'규칙은 아닙니다. OO와는 아무런 관련이 없습니다. 원래 규정 된 보안이 파괴 가능하지 않아야한다는 것은 기본 원칙입니다. – EJP

+0

원칙과 규칙이 다른 것은 무엇입니까 ?? –

+0

EJP가 말했듯이, 그것은 객체 지향과 관련이 없습니다. 또한 pst가 말하는 것처럼 C#에서는 "new"키워드를 사용하여 유사한 작업을 수행 할 수 있습니다. 그리고 C#은 객체 지향적입니다. – Christian

관련 문제