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

Я даю уроки по основам языка программирования 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) - это простая демонстрация того, как программировать интерфейс, а не ar оценка. Я думаю, что полиморфизм хорошо виден в параметрах метода makeItTalk (Animal animal) , а также в способе вызова метода talk с использованием объекта-животного (эта часть в порядке).

  • Вторая часть сбивает меня с толку. Она использовала instanceof на каком-то этапе своего экзамена (я не знаю, как выглядел их экзамен), и это было неправильно принято, потому что учитель сказал, что вы не доказываете полиморфизм.

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

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

  • Но как насчет полиморфизма в подходе 2?

  • Сколько вариантов использования полиморфизма вы видите там (только подход 2)?

  • Как вы думаете, в этой строке есть какой-то тип полиморфизма?

    ((Cat) animal) .climbToATree ();

Я думаю, что это так, потому что для достижения Приведения этого типа объекты должны иметь IS -Отношения, своего рода полиморфизм.

  • Как вы думаете, это правильно?

  • Если да, как бы вы объяснили своими словами, что приведение типов основано на полиморфизме?

6
задан Bill the Lizard 6 December 2012 в 18:13
поделиться