Почему Java позволяет повысить видимость защищенных методов в дочернем классе?
==============================================================================

Почему мы можемt уменьшить видимость, но можно ли ее увеличить?

Также мне нужно реализовать**Шаблон** в котором видимые публичные методы могут быть только базового класса.

Пример:

Теперь, если Java позволяет увеличить видимость, то есть два метода, видимых публично ??

Я знаю, что интерфейс - это одно из решений, но есть ли другой выход ???

Почему снижение видимости не допускается, уже объяснено в других ответах (это нарушит контракт родительского класса).

Но почему разрешено увеличивать видимость метода? Во-первых, это не нарушило бы ни один контракт, поэтому нет никаких причин, чтобы этого не допустить. Иногда это может быть полезно, когда в дочернем классе имеет смысл не защищать метод.

Во-вторых, недопущение этого может иметь побочный эффект: иногда невозможно расширить класс и реализовать интерфейс:

Что касается вашего второго вопроса, вы ничего не можете с этим поделать. Вы должны верить, что человек, который реализует дочерний класс, нене делайте ничего, что нарушает вашу реализацию. Даже если бы ява неt позволяет увеличить видимость, что все равно не решит вашу проблему, потому что можно создать открытый метод с другим именем, который вызывает абстрактный метод:



Поскольку Java допускает ссылку на класс Super для указания на объект подкласса. Таким образом, ограничение не должно быть увеличено с`compile-time` в`runtime`..

Давайте рассмотрим это на примере:

Теперь вы создаете объект класса`A` и назначьте ему ссылку класса`B`.. Давайте посмотрим, как: -

Теперь, так как`compiler` только проверяет**тип ссылочной переменной**и проверьте видимость методов в этом классе**(класс Б)**, и это**Безразлично»проверить, что за объект** делает`reference` obj ссылается на .. Итак, его это не беспокоит .. Это оставлено JVM во время выполнения для разрешения подходящего метода ..

Но**во время выполнения**JVM на самом деле будет пытаться**вызывать`meth`** метод класса`A` как объект класса А. Но теперь, что происходит ...**BooooOOMM ---> Сбои JVM**.. так как`meth` метод является частным в`class A`...

Тот'почему видимость не может быть уменьшена ..



Если базовый класс дает обещание относительно видимости, то подкласс не может нарушить это обещание и все еще удовлетворяет принципу замены Лискова. Вы можете't использовать подкласс в любой ситуации, где обещанный метод выставлен, если это обещание нарушено.

Подкласс IS-A базовый класс. Если базовый класс предоставляет метод, то и подкласс должен.

Там'нет выхода в Java или C ++. Я'Я думаю, то же самое верно и в C #.



Почему мы можемt уменьшить видимость, но можно ли ее увеличить?

Предположим, что можно было бы уменьшить видимость. Затем посмотрите на следующий код:

Предположим, что у вас был бы другой класс, в другом пакете, где вы используете эти классы:

Чтобы проверить, разрешен ли вызов метода или нет, компилятор проверяет тип переменной, для которой он вызывается. Тип переменной`a` является`Super`, Но фактический объект, который`a` относится к это`Sub`и там метод`protected`, так что вы бы сказали, что нельзя вызывать метод из несвязанного класса вне пакета. Чтобы решить эту странную ситуацию, этоЗапрещено делать переопределенные методы менее заметными.

Обратите внимание, что наоборот (делая метод более видимым) нене может привести к той же проблеме.