2014-10-08 2 views
1

У меня всегда этот вопрос горит во мне. Почему люди присвоить объекты подкласса суперкласса ссылки, как показано ниже:Назначение объектов подкласса для ссылки на суперкласс?

Что именно являются преимущества и причины, что делает людей сделать это?

public static void main(String[] args) 
{ 
    A obj1 = new C(); //Why do this ? 
    C obj2 = new C(); //When we can simply do this ??? 
} 

class A 
{} 

class B extends A 
{} 

class C extends B 
{} 

Я понимаю всю логику, где собака класса является животным, но животные не являются в основном собаками. Я также наткнулся на эту ссылку: Why assign a subclass object to a superclass reference?, которые задавали подобные вопросы, как мне (но был отмечен как дубликат с не соответствующей ссылке: What does it mean to "program to an interface"?)

В здесь: Why assign a subclass object to a superclass reference? Некоторые неопределенные ответы были даны в качестве причины для этого , К сожалению, более подробные ответы не могли быть даны до того, как они были отмечены дублирующимися с нерелевантной ссылкой.

Надеюсь, кто-то может изучить этот вопрос и дать подробный ответ на вопрос о назначении объектов подкласса ссылке на суперкласс.

+2

Знаете ли вы, что такое полиморфизм и почему он полезен? –

+0

да .. но если у вас есть некоторые идеи, возможно, вы могли бы поделиться им в решении? – user3437460

+0

Прочитать абстрактные классы и их использование ... – StackFlowed

ответ

2

Classic пример. Храните список объектов, которые могут рисовать себя и нарисовать их при необходимости.

List<Drawable> toDraw = new ArrayList<Drawable>(); 
// Add objects to draw 
toDraw.add(new Circle(0, 0, 10)); 
toDraw.add(new Rectangle(10, 10, 20, 20)); 

// draw them 
for (Drawable drawable : toDraw) { 
    // each object knows how to draw itself 
    drawable.draw(); 
} 

Если завтра кто-то осуществит новый выталкиваемый (скажем, треугольник), этот код по-прежнему будет работать.

Этот код также является примером принципа Open-Close, в котором говорится, что код открыт для расширения, но закрыт для модификации. Вам не нужно изменять код (модификацию), который рисует весь объект, но вы можете добавить новые чертежи (расширение).

1

В двух словах:

Class Pet 

    Class Dog extends Pet 
    Class Cat extends Pet 
    Class Mouse extends Pet 

можно обернуть домашних животных в «одном» список, путем продевания их в качестве домашнего животного:

List<Dog> dogs = new LinkedList<Dog>(); 
dogs.add(new Cat()) // error. 

List<Pet> pets= new LinkedList<Pet>(); 
pets.add(new Cat()); //works 
pets.add(new Dog()); //works 
pets.add(new Mouse()); //works 

Теперь, если кто-нибудь спросит вас, для ваших домашних животных, у вас есть только один список домашних животных:

for (Pet p : pets){ 
    System.out.println(p) //prints dog, mouse and cat. 
} 

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

Обратите внимание, что a cat, который взлетел до pet, не потеряет его специфические атрибуты cat. Они просто недоступны, а видно как домашнее животное - Вы можете бросить его кошке снова, чтобы позвонить cat.mew() или dog.bark().

+0

Я согласен с тобой. Ранее я делал аналогичный эксперимент, группируя объекты разных подклассов в список суперкласса. Однако есть ли другие причины, по которым люди так поступали? Я верю, что есть? Например: 'List myList = new ArrayList ' вместо 'ArrayList myList = new ArrayList ' – user3437460

+0

'Потому что, когда вы объявляете переменную как' List', другие разработчики могут назначать VARIOUS-списки этой переменной, выбирая реализацию, которая соответствует BEST (LinkedList для тяжелого добавления, ArrayList для интенсивного чтения). Если вы определяете его как ArrayList, они привязаны к этому типу. См. Http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist для большего различия списков. – dognose

+0

Подождите минуту. вы не указали, почему люди используют «Animal dog = new Dog();» вместо «Dog dog = new Dog();'? Выполняя оба способа, мы можем успешно вставить в список типа «Animal», но почему некоторые люди используют «Animal dog = new Dog();» вместо этого? – user3437460