Java: ссылки на поля в дочернем из родительского класса

#java #polymorphism

#java #полиморфизм

Вопрос:

итак, я работаю над назначением для моего класса Java, и я не могу найти способ ссылаться на поля в дочернем из моего родительского класса без необходимости передавать их через конструктор.

Например, я хочу, чтобы в моем родительском классе был этот метод:

 @Override
    public String getImageFileName() {     
        String result = IMG_DEAD;
        if (isAlive()) {
            result = IMG_ALIVE;
        }
        return resu<
    }
  

Я хочу, чтобы строки IMG_DEAD и IMG_ALIVE были определены в моем дочернем элементе, поскольку у каждого дочернего элемента они будут разными.

Каков наилучший способ сделать это? Я пробовал использовать статические поля, но в итоге всегда ссылаюсь только на те, что находятся в моем родительском классе.

Я заставил это работать, просто передавая значения через конструктор, но я бы предпочел не делать этого, если есть способ получше. Эти переменные также должны быть статическими, поскольку они постоянны для каждого класса.

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

1. tutorialspoint.com/java/java_polymorphism.htm

Ответ №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 Соответственно Переопределение «точно таким же методом» — это весь смысл полиморфизма — вы предоставляете поведение замены для каждого класса, где это необходимо. Переопределение полей было бы серьезной головной болью, и у вас все равно была бы точно такая же гипотетическая проблема с обслуживанием в будущем.