Можно ли переделать в классе "А" метод "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
Комментариев нет:
Отправить комментарий