Страницы

Поиск по вопросам

понедельник, 18 марта 2019 г.

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

Можно ли переделать в классе "А" метод "function1" так, чтобы получить вывод "AA"?
package javatest;
public class JavaTest {
public static void main(String[] args) throws Exception { new B().function1(); } }
class A { public void function1() { System.out.println("A"); function2(); } protected void function2() { System.out.println("A"); } } class B extends A { public void function1() { super.function1(); } public void function2() { System.out.println("B"); } }
На PHP это можно было бы написать так:
class A { public function function1() { echo("A"); self::function2(); } protected function function2() { echo("A"); } } class B extends A { public function function1() { parent::function1(); } public function function2() { echo("B"); } } $b = new B(); $b->function1();


Ответ

В Java так сделать не получится, т.к. все методы виртуальны и, насколько мне известно, нет синтаксического сахара для обращения к конкретной реализации.
Соответственно, если вызывается метод с модификатором protected, то ожидается, что поведение этого метода может быть переопределено наследниками. В этом весь смысл виртуальных методов.
Для того чтобы внутреннее поведение метода нельзя было переопределить в наследниках, можно использовать методы private, которые наследникам недоступны.
Например, так:
class A { public void function1() { System.out.println("A"); function3(); } protected void function2() { function3(); }
private void function3() { System.out.println("A"); } }
Т.о. общий код function1 и function2 вынесен в отдельный метод function3. При этом классы-наследники могут переопределить поведение function2 без вреда для function1

Комментариев нет:

Отправить комментарий