#java #polymorphism
#java #полиморфизм
Вопрос:
итак, я работаю над назначением для моего класса Java, и я не могу найти способ ссылаться на поля в дочернем из моего родительского класса без необходимости передавать их через конструктор.
Например, я хочу, чтобы в моем родительском классе был этот метод:
@Override
public String getImageFileName() {
String result = IMG_DEAD;
if (isAlive()) {
result = IMG_ALIVE;
}
return resu<
}
Я хочу, чтобы строки IMG_DEAD и IMG_ALIVE были определены в моем дочернем элементе, поскольку у каждого дочернего элемента они будут разными.
Каков наилучший способ сделать это? Я пробовал использовать статические поля, но в итоге всегда ссылаюсь только на те, что находятся в моем родительском классе.
Я заставил это работать, просто передавая значения через конструктор, но я бы предпочел не делать этого, если есть способ получше. Эти переменные также должны быть статическими, поскольку они постоянны для каждого класса.
Комментарии:
Ответ №1:
Похоже, что каждый дочерний элемент должен предоставлять информацию об этом. Обычно лучшим способом сделать это является метод в родительском классе, который переопределяет дочерний класс, что-то вроде этого:
protected String imageFileName(boolean alive) {
return alive ? DEFAULT_IMG_ALIVE : DEFAULT_IMG_DEAD;
}
Затем в ваших дочерних классах переопределите этот метод:
@Override
protected String imageFileName(boolean alive) {
return alive ? GRUE_IMG_ALIVE : GRUE_IMG_DEAD;
}
Если вы хотите требовать от дочерних элементов изображения без значения по умолчанию, вместо этого создайте родительский метод abstract
.
Комментарии:
1. Проблема в том, что все мои дочерние элементы будут переопределять этот метод точно таким же методом, который, как мне кажется, противоречит цели наследования метода. Наряду с этим, если бы я когда-нибудь захотел изменить этот метод, мне пришлось бы изменить его во всех дочерних классах. Я хотел бы, чтобы был способ переопределить поля в дочерних классах, но без необходимости переопределять методы.
2. @Robert Соответственно Переопределение «точно таким же методом» — это весь смысл полиморфизма — вы предоставляете поведение замены для каждого класса, где это необходимо. Переопределение полей было бы серьезной головной болью, и у вас все равно была бы точно такая же гипотетическая проблема с обслуживанием в будущем.