Я даю уроки по основам языка программирования Java студентам, изучающим этот предмет в колледже.
Сегодня одна из них действительно запутала меня в ее вопросе, поэтому я попросил ее дать мне всего один день, чтобы подумать о проблеме, и я дам ей максимально точный ответ.
Она сказала мне, что учитель очень разозлился, когда она использовала ключевое слово instanceof
в своем экзамене.
Также она сказала, что учитель сказал, что нет способа доказать, как работает полиморфизм, если она использует это слово.
Я много думал, чтобы попытаться найти способ доказать, что в некоторых случаях нам нужно использовать instanceof
, а также, что даже если мы его используем, в этом подходе все еще присутствует некоторый полиморфизм.
Итак, вот пример, который я сделал:
public interface Animal
{
public void talk();
}
class Dog implements Animal {
public void talk() {
System.out.println("Woof!");
}
}
public class Cat implements Animal
{
public void talk() {
System.out.println("Meow!");
}
public void climbToATree() {
System.out.println("Hop, the cat just cimbed to the tree");
}
}
class Hippopotamus implements Animal {
public void talk() {
System.out.println("Roar!");
}
}
public class Main {
public static void main(String[] args) {
//APPROACH 1
makeItTalk(new Cat());
makeItTalk(new Dog());
makeItTalk(new Hippopotamus());
//APPROACH 2
makeItClimbToATree(new Cat());
makeItClimbToATree(new Hippopotamus());
}
public static void makeItTalk(Animal animal) {
animal.talk();
}
public static void makeItClimbToATree(Animal animal) {
if(animal instanceof Cat) {
((Cat)animal).climbToATree();
}
else {
System.err.println("That animal cannot climb to a tree");
}
}
}
Мои выводы следующие:
Первый подход (ПОДХОД 1) - это простая демонстрация того, как программировать на интерфейс, а не реализация. Я думаю, что полиморфизм отчетливо виден в параметрах метода makeItTalk(Animal animal)
, а также в способе вызова метода с использованием объекта животного. (Эта часть в порядке)
Вторая часть меня смущает. Она использовала instanceof
в какой-то момент своего экзамена (я не знаю, как выглядел их экзамен), и это было неправильно принято, потому что учитель сказал, что вы не доказываете полиморфизм.
Чтобы помочь ей понять, когда она может использовать instanceof
, я подумал сказать ей, что она может использовать его, когда метод, который ей нужно вызвать, находится не в интерфейсе, а только в одном из реализующих классов. .
Как вы можете видеть, только кошки могут карабкаться на деревья, и было бы не логично заставить Бегемота или Собаку подняться на дерево. Я думаю, что это может быть примером того, когда использовать instanceof
А как же полиморфизм в подходе 2?
Сколько случаев использования полиморфизма вы видите там (только подход 2)?
Как вы думаете, в этой строке есть какой-то тип полиморфизма?
((Cat)animal).climbToATree();
Я думаю, что так и есть, потому что для достижения Кастинга такого типа объекты должны иметь отношение IS-A, в некотором роде это полиморфизм.
Как вы думаете, это правильно?
Если да, как бы вы объяснили своими словами, что кастинг основан на полиморфизме?