#java #inheritance
#java #наследование
Вопрос:
Есть ли способ вызвать методы родительского класса, которые переопределяются дочерним классом, используя объект дочернего класса? Я знаю, что вы можете использовать super.foo() внутри переопределенного метода для перенаправления вызова метода родительского класса, но есть ли способ, который не включает сначала переход к методу дочернего класса перед вызовом родительского метода?
Комментарии:
1. Если это та ситуация, с которой вам нужно столкнуться, то дизайн программы оставляет желать лучшего, и вы должны рассмотреть возможность перепроектирования. Чем больше вы применяете исправлений, чтобы нарушить основные принципы OOPS, тем более грязным и неуправляемым будет код.
Ответ №1:
Нет.
Если объект класса Child
вызывается для выполнения x()
, то в Java его class ( Child
) несет ответственность за правильную реализацию. Таким образом, Child
класс всегда отвечает, и это единственное решение Child
класса, вызывать ли его метод родительского класса в процессе обслуживания x()
вызова.
Если вы обнаружите ситуации, когда реализация дочернего класса не подходит для обслуживания x()
вызова, то это ошибка реализации этого Child.x()
метода, и вам нужно исправить эту реализацию, чтобы правильно обслуживать вызов.
Если для некоторых заданных параметров вызова дочерний класс не может определить, как правильно обслуживать вызов, то конструкция этого метода (как контракта между вызывающим и вызываемым) ошибочна, и вам следует это исправить, например, создать два разных метода из x()
.
Ответ №2:
Вам не нужно вызывать super.foo() из реализации дочернего класса foo().
public class Main {
static class A {
void foo() {
System.out.println("A.foo()");
}
}
static class B extends A {
void foo() {
System.out.println("B.foo()");
}
void bar() {
super.foo();
}
}
public static void main(String[] args) {
B b = new B();
b.bar();
}
}