Почему методы подклассов могут быть более доступными? - PullRequest
0 голосов
/ 05 октября 2018

Быстрый пример

class A {
    protected int foo(int x){
        return x;   
    }
}

class B extends A {
    public int foo(int x){
        return x*x; 
    }
}

Это разрешено в Java и работает без каких-либо проблем.Но скажем, в другом пакете вы объявляете

A b = new B();
int z = b.foo(5);

Тогда это не сработает, потому что очевидно, что foo () защищен.Но тогда зачем разрешать в первую очередь иметь более доступные методы в подклассах?Есть ли такой случай, когда это полезно?

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Вы могли бы сделать второй пример компиляции, если вы заменили A на B.В том-то и дело: B можно использовать везде, где это возможно, но также можно добавлять дополнительные функции (например, делать методы общедоступными).

0 голосов
/ 05 октября 2018

Как правило, подклассы могут добавлять методы в интерфейс, который они наследуют от своего родительского класса.Создание более доступного метода - это эффективное добавление в интерфейс.

Но тогда зачем в первую очередь иметь более доступные методы в подклассах?

Потому что он можетбыть полезным для кода, который содержит ссылку на подкласс.

Есть ли такой случай, когда это полезно?

Один хороший пример - Object.clone(), защищенный метод.Все классы Java являются подклассами, прямо или косвенно, Object.Подклассы, которые поддерживают клонирование, могут сделать этот метод общедоступным.

Foo foo1 = new Foo();
Foo foo2 = foo1.clone(); // Sometimes you're holding a subclass reference.
0 голосов
/ 05 октября 2018

Потому что классификация должна позволять вам думать о подклассах как об экземплярах их суперклассов.Я думаю, это называется отношением is-a (а именно B is-a A, но не наоборот).Я действительно не знаю хорошего способа объяснить это кратко.

В вашем примере все случаи B также являются случаями A (имейте в виду, что это может быть чрезмерным упрощением, но я думаю,для этого примера достаточно).A гарантирует только общедоступные методы в своем собственном определении.B просто делает один из защищенных методов public, но давайте предположим, что у вас есть другой класс с именем C, который этого не делал.Ну, вы можете преобразовать B и C в A, но если вам было разрешено вызывать защищенный метод на A, потому что B делает его общедоступным, вы получите ошибку при передаче C.

В другом пакете вы преобразуете B в A, поэтому ваш объект эффективно принимает интерфейс A, поэтому вы можете использовать только тот интерфейс, который вам предоставлен.на A.Может ли JVM справиться с проблемой и заметить, что 1) A на самом деле B и что 2) B делает foo общедоступным, поэтому foo должно вызываться?Я имею в виду, могу ли я предположить, но сколько усилий потребуется для реализации в JVM и насколько это будет подвержено ошибкам?Будь проще.Если тип A, то интерфейс A.Если тип B, то интерфейс A и все остальное, что B включает в себя.

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