2014-09-17 5 views
0

У меня есть достойное понимание полиморфизма, но мой вопрос, например, в коде, который я опубликовал ниже, настолько особенный в том, что он может создать объект Cat, используя тип животного для переменной. Какая цель это служит? Также предположим, что метод makenoise переопределяется в каждом объекте собственного класса и что класс, на который наследуются другие классы, является классом животных.Что так важно в отношении полимофизма?

public class Demo 
{ 
    public static void main(String[] args) { 
     Animal a1 = new Cat(); //prints meow 
     a1.makeNoise(); 

     Animal a2 = new Dog(); 
     a2.makeNoise(); //Prints Bark 
    } 
} 
+0

Возможный дубликат [Польза полиморфизма] (http://stackoverflow.com/questions/11082640/benefit-of-polymorphism) – jdphenix

+0

Близко связанный: [Что означает «программировать интерфейс»?] (Http : //stackoverflow.com/q/383947/1065197) –

ответ

1

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

Чтобы расширить пример немного мы бы

abstract class Animal { 
    public abstract void makeNoise(); 
} 

class Cat extends Animal { 
    public void makeNoise() { System.out.println("meow");} 
} 

class Dog extends Animal { 
    public void makeNoise() { System.out.println("woof");} 
} 

class Demo { 
    public static void main(String[] args) { 
     List<Animal> animals = new ArrayList<Animal>(); 
     animals.add(new Cat()); 
     animals.add(new Dog()); 
     for (Animal animal: animals) { 
      animal.makeNoise(); 
     } 
    } 
} 

Здесь программа Demo может пробежать список животных без внесения каких-либо особых случаев, для которых животные являются собакой, и которая одна кошка. Это означает, что я могу добавить новые подклассы Animal, и содержимое for-loop никогда не должно меняться.

Если бы не было полиморфизма код будет выглядеть

class Dog { 
    public void bark() {System.out.println("woof");} 
} 

class Cat { 
    public void meow() {System.out.println("meow");} 
} 

class Demo { 
    public static void main(String[] args) { 
     ArrayList<Object> animals = new ArrayList<Object>(); 
     animals.add(new Cat()); 
     animals.add(new Dog()); 
     for (Object animal: animals) { 
      if (animal instanceof Dog) { 
       ((Dog)animal).bark(); 
      } else if (animal instanceof Cat) { 
       ((Cat)animal).meow(); 
      } 
     } 
    } 
} 

и теперь нет Общность о классах животных, что программа может сделать использование. Без какого-либо полезного обобщения для использования Demo должно знать намного больше о деталях. Каждый новый вид животных будет необходим для добавления к телу.

Смежные вопросы