Если у меня есть класс Foo
, который вызывает метод типа someMethod
в своем конструкторе, и я хочу переопределить someMethod
, чтобы использовать аргументы конструктора, которые я недавно добавил в этот подкласс, как я могу сделать это?
Предположим, что Foo
имеет конструктор noargs, который вызывает someMethod
. То, что я wi sh мог бы сделать , выглядит примерно так:
public class Bar extends Foo {
private String x;
private String y;
public Bar(String x, String y) {
this.x = x;
this.y = y;
super();
}
@Override
public void someMethod() {
// do stuff with x and y
}
}
Конечно, я не могу этого сделать, потому что Java настаивает на том, что вызов конструктора суперкласса в первой строке конструктора подкласса. Если бы я переместил его в первую строку, он был бы вызван до инициализации x и y, и поэтому someMethod
не использовал бы их значения, переданные в мой конструктор.
Кажется, я могу обойти это, используя inner классы, но это довольно ужасно.
public class Bar extends Foo {
private String x;
private String y;
private Foo baz;
public class Foobar extends Foo {
@Override
public void someMethod {
// do stuff with Foo.this.x and Foo.this.y
}
}
public Bar(String x, String y) {
this.x = x;
this.y = y;
baz = new Foobar();
}
// override ALL of the remaining methods, including someMethod, delegating them to baz
}
Это ужасное решение, является ли это принятым шаблоном и есть ли лучший способ?
ПРИМЕЧАНИЕ. Чтобы уточнить, если это не очевидно, класс Foo
не находится под контролем разработчика (например, он является частью сторонней библиотеки). Разработчик пытается расширить Foo
, и поэтому любые проектные решения, принимаемые Foo
(например, неконечный метод, вызываемый из конструктора), не являются вещами, на которые может повлиять разработчик.
РЕДАКТИРОВАТЬ: Люди спрашивают в комментарии, если someMethod
является приватным. Это не личное, если бы это было так, я бы не смог это переопределить Вот пример указанного класса Foo
для иллюстрации:
public class Foo {
public Foo() {
// some other stuff...
someMethod();
}
public void someMethod() {
// nothing of consequence
}
// some other methods, which aren't relevant to the question
}