Использование объекта базового класса ссылкой на дочерний класс - Java - PullRequest
0 голосов
/ 20 марта 2010

Какая польза от создания объекта базового класса с использованием ссылки на дочерний класс в Java

Ответы [ 3 ]

4 голосов
/ 20 марта 2010

Если я правильно понимаю, вы имеете в виду:

class Parent {
   ...
}

class Child extends Parent {
   ...
}

Parent p = new Child ();

Есть много причин:

  1. Гибкость: вы можете использовать Parent в качестве типа параметра и передать любой подкласс (то есть дочерний и другие) в качестве этого параметра.

  2. Полиморфизм: Вы можете переопределить метод Parent в нескольких дочерних классах и использовать их по очереди там, где требуется родительский объект (как в шаблоне Strategy)

  3. Если вы работаете над каким-то открытым API, вы можете сделать родительский класс общедоступным и видимым для всех, но все дочерние объекты могут быть невидимыми для внешних пользователей. Это может сделать ваш API более узким. Хорошим примером является API коллекций. Существует 32 реализации (т.е. дочерние), которые используются неявно, но только несколько открытых интерфейсов. Вы можете получить синхронизированные, немодифицируемые и другие коллекции через интерфейс Collection (т.е. родительский), не зная деталей реализации.

2 голосов
/ 07 марта 2013
Animal myAnimal1 = new Dog();
Animal myAnimal2 = new Cat();
Animal myAnimal3 = new Horse();

Предположим, у Animal есть метод с именем getAnimalSound () , и Dog, Cat, Horse все переопределяют этот метод в соответствии с ними. Теперь этот код очень расширяем, у вашего API может быть только один метод getAnimalSound () для указания звука любого вида животного, в крачке каждый класс животных уже реализовал свою собственную версию getAnimalSound ()

System.out.println(getAnimalSound(myAnimal1)); //runtime finds animal1 is dog, prints Bark
System.out.println(getAnimalSound(myAnimal2));//runtime finds animal2 is cat, prints Meow
System.out.println(getAnimalSound(myAnimal3));//runtime finds animal3 is horse, prints Niih

Как вы можете видеть, один метод getAnimalSound () является стандартным API, но мы достигли такой степени расширяемости.

0 голосов
/ 20 марта 2010

Если вы имеете в виду такие вещи, как

List<String> list = new ArrayList<String>()

тогда вы фактически не создаете экземпляр суперкласса. Вы только говорите пользователю обращаться с ним, как если бы он был один. Дело в том, что вам часто не нужно знать точную реализацию, которая была выбрана, и вы хотите сохранить возможность изменять реализацию. Следовательно, вы только сообщаете пользователю API, что что-то является списком, и если ваш алгоритм требует этого, вы можете изменить реализацию, чтобы вместо этого использовать LinkedList, без изменения API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...