Наследование классов - PullRequest
       0

Наследование классов

2 голосов
/ 05 марта 2011

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

Class Animal{}

Class Dog : Public Animal{}

Animal a = new Dog() возможно, но почему

Dog g = new Animal() невозможно.

Я знаю, что согласно вышеупомянутым отношениям «Собака» - это «Животное, но не Животное», это «Собака». Но какова техническая причина этого? Почему мы не можем назначить это?

Ответы [ 7 ]

3 голосов
/ 05 марта 2011

Потому что собаки лают.Животные, как правило, не делают.

Dog g = new Animal();
g.bark();

Как бы g узнал лаять?Сделало ли это задание магическое превращение животного в собаку?Что если это был попугай?Как мы превращаем попугаев в собак?Или, если задание ничего не преобразовало, как попугай узнает, как лаять?(Обратите внимание, что это норвежский голубой попугай, который не знает, как сделать что-нибудь .)

2 голосов
/ 05 марта 2011

Потому что тогда вы могли бы написать

Animal animal = new Rabbit();
Dog d = animal;
d.bark(); // but it's a Rabbit
2 голосов
/ 05 марта 2011

Это логическая и техническая причина - экземпляр Animal не имеет всех методов и полей Dog.Например:

class Animal {
    public int legs;
}
class Dog extends Animal {
    public int fangs;
}

Dog dog = new Animal();
dog.fangs = 5;

, но вы используете Animal, который не имеет fangs, поэтому он потерпит неудачу.

Вы можете обычно понижатьхотя:

 public doSomethingDoggish(Animal animal) {
     ((Dog) animal).bark();
 }

Но если вы не пропустили туда экземпляр Dog, он потерпит неудачу во время выполнения.

1 голос
/ 05 марта 2011

Потому что ваша собака - животное.

Dog g = new Dog()

Теперь у вас есть животное.Это особый тип животных, но все же животное.Он может делать все то, что может делать животное.

Если я хочу относиться к нему только как к животному и игнорировать тот факт, что это собака, я могу сделать это с Animal a = new Dog()

Животное не собака.Он не может делать все то, что может делать собака.Так что, если я попытаюсь сказать Dog g = new Animal() ... я не имею никакого смысла.Я пытаюсь забрать все, что делает собаку собакой.

1 голос
/ 05 марта 2011

классический термин «IS-A», как в «собака ЕСТЬ (n) животное», но «животное НЕ является собакой» в ваших отношениях.

Именно поэтому вы можете назначить собаку на животное, но не наоборот.

0 голосов
/ 05 марта 2011

Поскольку вы спросили по техническим причинам, рассмотрите возможность хранения в памяти: «new Animal ()» требует только достаточно ресурсов для хранения минимальных данных, требуемых для всех животных, но «new Dog ()» требует больше ресурсов - ресурсовМлекопитающее (мех, теплая кровь) и ресурсы Собаки (увлечение белками).

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

0 голосов
/ 05 марта 2011

Классы похожи на контракты. Когда вы определяете свой Animal класс, вы говорите что-то вроде: «Это животное, он может это сделать». Когда вы определяете Dog, вы говорите: «Собака - это животное, он может делать все, что делает животное, но он также может делать это».

Теперь, когда вы делаете Animal a = new Dog(), это нормально, поскольку Dog может делать все, что делает Animal.

Но когда вы делаете Dog g = new Animal(), вы нарушаете свой контракт, поскольку Animal не может сделать «это», может только Dog.

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