Страницы

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

пятница, 24 января 2020 г.

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

#java


Можно ли переделать в классе "А" метод "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();

    


Ответы

Ответ 1



В 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.

Ответ 2



Если я правильно понял, вам нужно вывести "AA" в одну строку? Если так, то используйте "print" вместо "println"

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

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