Цель: не переопределять метод в каждом классе потомке (будь-то toString или getType), а чтоб метод класса родителя мог получить доступ (прочесть) статистическое поле класса наследника.
В принципе текущий код (нашел его в инете) это и делает, но он мне не нравится. Я так понял, он переопределяет само поле.
Так же была ещё одна мысль: если вместо
return ((Animal) o).getType();
написать
return Cat.type;
Получаем значение статической переменной type класса Cat.
И вот как здесь использовать полиморфизм чтоб обратиться к полю type класса в зависимости от к какому классу принадлежит объект?
o.getClass().getSimpleName() возвращает имя класса, вот если бы к этому имени дописать .type - всё бы работало.package com.javarush.task.task12.task1225;
/*
Посетители
*/
public class Solution {
public static void main(String[] args) throws Exception {
System.out.println(getObjectType(new Cat()));
System.out.println(getObjectType(new Tiger()));
System.out.println(getObjectType(new Lion()));
System.out.println(getObjectType(new Bull()));
System.out.println(getObjectType(new Cow()));
System.out.println(getObjectType(new Animal()));
}
public static String getObjectType(Object o) throws Exception {
//напишите тут ваш код
if (o instanceof Animal){
return ((Animal) o).getType();
}
return null;
}
public static class Cat extends Animal { //<--Классы наследуются!!
static String type = "Кот";
}
public static class Tiger extends Cat {
static String type = "Тигр";
}
public static class Lion extends Cat {
static String type = "Лев";
}
public static class Bull extends Animal {
static String type = "Бык";
}
public static class Cow extends Animal {
static String type = "Корова";
}
public static class Animal {
static String type = "Мивотное";
public String getType() throws Exception {
java.lang.reflect.Field field = this.getClass().getDeclaredField ("type");
return field.get(null).toString();
}
}
}