Почему плохая идея иметь массив Object []? - PullRequest
0 голосов
/ 06 ноября 2011

Несколько дней назад я объяснял другу концепцию или наследование и контейнеры.

У него очень мало знаний в области программирования, так что это был просто дружеский разговор.Во время разговора он пришел ко мне с вопросом, на который я просто не смог ответить.

"Почему вы не можете просто получить массив класса верхнего уровня и добавить что-нибудь к нему"

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

Я имею в виду, что мы делаем это все время с наследованием.

Скажем, у нас есть классное животное, которое является родителем кошки и собаки.Если нам нужен контейнер обоих из них, мы создаем массив типа animal.

Итак, допустим, у нас не было этой ссылки наследования, мы не могли бы просто использовать базовый класс объекта и иметь все водин контейнер.


Нет специального языка программирования.

Ответы [ 5 ]

2 голосов
/ 06 ноября 2011

Синтаксически, с этим проблем нет.Объявляя массив определенного типа, вы даете неявную информацию о содержимом этого массива.Вы вполне могли бы объявить содержимое Object экземпляров, но это означает, что вы теряете всю информацию о типе исходного класса во время компиляции.

Это также означает, что каждый раз, когда вы получаете объект из массиваво время выполнения единственные известные вам экземпляры и методы полей - это поля / методы Object (что, возможно, является проблемой времени компиляции).Чтобы использовать любое из полей и методов более определенных подклассов объекта, вам нужно привести.

В качестве альтернативы, чтобы узнать конкретный класс во время выполнения, вам придется использовать такие функции, как отражение, которые являютсяперебор для большинства случаев.

0 голосов
/ 06 ноября 2011

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

Plant myplant = new Plant();
listOfAnimals.Add(myplant); 

будет работать, если список является объектом, но вы получите ошибку времени компиляции, если это был Animal.

0 голосов
/ 06 ноября 2011

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

0 голосов
/ 06 ноября 2011

Может быть, мы делаем это в программировании по той же причине, что и в биологии? Рептилии и киты - животные, но они совершенно разные.

0 голосов
/ 06 ноября 2011

Когда вы вынимаете элементы из контейнера, вы хотите иметь некоторые гарантии относительно того, что можно сделать с ними. Если все элементы контейнера возвращаются как экземпляры Animal (помните, что экземпляры Dog также являются экземплярами Animal), то вы знаете, что они могут делать все то, что может Animals больше вещей, чем могут сделать все Objects.

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