Почему более слабые переопределенные функции не разрешены в Java? - PullRequest
0 голосов
/ 19 марта 2012

У меня есть следующий код:

public class Library {

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

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

}

В приведенном выше коде есть ошибка, поскольку класс Book пытается переопределить функцию класса supper с более слабым модификатором доступа.Я знаю, что это правило Java.Но мне любопытно, почему это?В чем проблема это может вызвать?

Ответы [ 5 ]

5 голосов
/ 19 марта 2012

Рассмотрим из совершенно другой упаковки:

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

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

Проблема действительно сводится к тому, что myFunction является виртуальным ; Вызванный метод зависит от типа времени выполнения , а не от статического типа выражения. (Я полагаю, что C # действительно допустит это для не виртуального метода с модификатором new.)

0 голосов
/ 19 марта 2012

это правило объектно-ориентированного языка. Вы не можете связать контроль доступа переопределенного метода. если переопределенный метод защищен, вы можете переопределить его как общедоступный, но наоборот невозможно

0 голосов
/ 19 марта 2012

Допустим, есть класс Reader

public class Reader {
  private final Library library;

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

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

, который инициализируется с экземпляром Book:

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

Тогда читатель не сможет прочитать книгу, поскольку его метод read не виден в контексте Reader. Reader может получить доступ к методу Library read, но не может получить доступ к методу Book read, что довольно странно, да?

0 голосов
/ 19 марта 2012

Ваш пример немного отличается, поскольку книга не является библиотекой. Но давайте рассмотрим легковой и грузовой автомобиль.

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 голосов
/ 19 марта 2012

Конечно, потому что если кому-то дана библиотека, то он должен был бы вызвать myFunction, так как она является публичной в своей подписи.

Так что, если вы вернете книгу типа Library test = getALibraryObject();, вы увидите, что метод можетНе быть защищенным в одном объекте, а не в других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...