#java #inheritance #casting
#java #наследование #Кастинг
Вопрос:
Итак, мне дали задание из университета, и я просто не могу взять в толк, как возникла эта проблема, я единственный человек в классе, который зашел так далеко, а мои лекторы мне не перезванивают.
В основном это наследование и полиморфизм, мы используем родительский класс, а затем создаем дочерние элементы из родительского;
private HashMap<String,Aircraft> allAircraft = new HashMap<String,Aircraft>();
Aircraft plane = new Plane(reg,pass,cargo);
Таким образом, родитель не может использовать дочерние методы, я понимаю большую часть концепции, лежащей в основе этого, и мне удалось разобраться в этом. Для одного из методов нас специально попросили использовать приведение (хотя мне бесчисленное количество раз говорили, что если мне придется его использовать, то я должен реструктурировать), но для другого метода нас попросили вызвать метод, который специфичен только для двух дочерних классов, приведение выигралоздесь не работает, потому что я не знаю, какие дочерние классы находятся в HashMap.
Итак, мой вопрос; как бы я предпочел два дочерних класса методам родительского класса при использовании полиморфизма?
Мой разум буквально взрывается.
Ответ №1:
Если вам нужно понизить, значит, вы больше не используете полиморфизм. Если это то, чего хочет учитель, то вы все равно можете отказаться безопасным способом, проверив, что фактический тип объекта является подходящим :
if (plane instanceof SubClass1) {
SubClass1 s = (SubClass1) plane;
s.someSpecificMethod();
}
if (plane instanceof SubClass2) {
SubClass2 s = (SubClass2) plane;
s.someSpecificMethod();
}
Если этот метод является общим для обоих подклассов, это может означать, что они фактически используют один и тот же интерфейс. Таким образом, полиморфизм может вернуться в игру здесь :
public interface PassengerTransporter {
void someSpecificMethodToAllPassengerTransporters();
}
public class SubClass1 implements PassengerTransporter {
void someSpecificMethodToAllPassengerTransporters() {
// TODO : implement this
}
}
public class SubClass2 implements PassengerTransporter {
void someSpecificMethodToAllPassengerTransporters() {
// TODO : implement this
}
}
if (plane instanceof PassengerTransporter) {
PassengerTransporter p = (PassengerTransporter) plane;
p.someSpecificMethodToAllPassengerTransporters();
}
Комментарии:
1. Отлично, я знал, что должен был быть способ его кондиционирования. Приветствую бад!
Ответ №2:
Если вы не можете изменить базовую / производную иерархию на данном этапе, загляните в instanceof
оператор.
Ответ №3:
Вы можете узнать точный класс объекта с помощью getClass()
метода или, в качестве альтернативы, вы можете спросить, относится ли объект к определенному типу, используя instanceof
оператор. В любом случае, не элегантно запрашивать у объекта его определенный класс, но в некоторых случаях у вас нет выбора.