Сомнения в использовании полиморфизма, а также в том, как полиморфизм связан с приведением типов?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Сомнения в использовании полиморфизма, а также в том, как полиморфизм связан с приведением типов?

Сообщение Anonymous »

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

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

Она рассказала мне что учительница очень разозлилась, когда она использовала ключевое слово экземпляр в своей экзамен.

Кроме того, она сказала, что учительница сказала, что невозможно доказать, как работает полиморфизм, если она использовала это слово.

Я много думал, пытаясь найти способ доказать, что в некоторых случаях нам нужно использовать 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)
    [/b], а также в способе вызова метода talk с использованием объекта животного. (Это нормально)
  • Вторая часть меня смущает. В какой-то момент своего экзамена она использовала instanceof (я не знаю, как выглядел их экзамен), и это не было принято правильно, потому что учитель сказал: вы не доказываете полиморфизм.
Чтобы помочь ей понять, когда она может использовать экземпляр, я подумал о том, чтобы сказать ей, что она может использовать его, когда метод она нужно вызвать не в интерфейсе, а просто в одной из реализаций классы.

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

Код: Выделить всё

instanceof
[/b]
  • А как насчет полиморфизма в подходе 2?
  • Сколько случаев применения полиморфизма вы там видите (только подход 2)?
  • Как вы думаете, эта строка имеет какой-то тип полиморфизма в нем?

    Код: Выделить всё

    ((Cat)animal).climbToATree();
Я думаю, что да, потому что для достижения приведения этого типа объектам необходимо иметь отношение IS-A, что в некотором роде является полиморфизмом.
  • Как вы думаете, это правильно?
  • Если да, то как бы вы объяснили своими словами, что кастинг основан на полиморфизме?


Подробнее здесь: https://stackoverflow.com/questions/623 ... sm-related
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»