Почему полиморфизм так работает?

В общем только пытаюсь в нем разобраться. Как я понял есть скажем суперкласс one и пораженный от него класс two. Получается я хочу написать следующее:

one x = new two();

Работать могу с методами в two только которые не затрагивают строки добавленные в пораженном классе two. Точнее не затрагивают а не изменяют строки в поражденном классе ведь я могу в параметрах создания объекта указать какие параметры мне нужно задать и работать я как бы смогу с ними. Почему и в чем вообще смысл полиморфизма?
  • Вопрос задан
  • 964 просмотра
Решения вопроса 3
pi314
@pi314
Президент Солнечной системы и окрестностей
Объяснить суть полиморфизма "на пальцах" довольно просто. Представьте себе класс Телефон. Его спроектировал некто в далеких 80-х, и определил в нем метод набратьНомер(). А потом другой программист в 90-х отнаследовал от него класс МобильныйТелефон и перекрыл метод набратьНомер(), т.к. грубо говоря, в новом устройстве набор производится уже не импульсно, а тонально. А потом третий программист отнаследовал от него класс Смартфон. При этом он не стал трогать метод набратьНомер(), а просто добавил методы для нового функционала, типа определитьПоложениеПоGPS() и т.д.

Теперь представьте себе пользователя. Он родом из 80-х и понятия не имеет о тональном наборе и GPS... но если ему в руки дать любое из этих устройств, он сможет набрать номер и сделать звонок. Почему? Потому, что он умеет использовать метод набратьНомер(), и большего ему знать не нужно.

А теперь представьте другого пользователя, нашего современника. Он вырос в эпоху смартфонов... но если ему в руки дать старый телефонный аппарат, он тоже сможет сделать звонок, т.к., опять же, знает метод набратьНомер().

Применительно к ООП, пользователь - это переменная, содержащая ссылку на экземпляр класса. Ее тип (как она была объявлена) - это "набор знаний" о возможностях этого экземпляра. И т.к. Смартфон в своей основе является Телефон-ом, мы вполне можем дать его в руки гипотетическому пользователю из 80-х:
Телефон устройство = new Смартфон();
в результате чего он сможет сделать звонок:
устройство.набратьНомер("03");
А вот определить свое местоположение он не сможет, пока не узнает о существовании соотв. метода:
Смартфон усовершенствованноеУстройство = (Смартфон)устройство;

Это называется приведением типа. В данном примере у экземпляра класса уже был соотв. метод, но чтоб им воспользоваться, нужно сначала явно указать, что мы хотим рассматривать имеющееся у нас в руках устройство не как "простой" Телефон, а как Смартфон.

P.S. Кстати, в этом примере мы затронули не только полиморфизм, но и наследование, и инкапсуляцию (пользователя "снаружи" совершенно не интересует, как именно производится набор номера - тонально, импульсно или еще как-то иначе)... так сказать, все три кита ООП в одном флаконе. И только так вообще имеет смысл рассматривать эти принципы, т.к. они по сути неотделимы друг от друга, как Отец, Сын и Святой Дух в Христианстве или же длина, ширина и высота в трехмерном пространстве :) Если это понять, ООП становится совершенно простой и естественной парадигмой программирования.
Ответ написан
timych
@timych
Вот тут очень простой и понятный пример: cybern.ru/java-polymorphism.html

Если вы хотите вызывать собственные методы в наследуемом классе (те , которые не являются переопределенными). То необходимо либо обьявлять конкретный класс, а не родительский:
Two x = new Two();
либо делать явное приведение типов:
One x = new Two();
Two z = (Two)x;
Ответ написан
Ewintory
@Ewintory
Java / Android developer
пораженном
никто не говорит, откуда вы такой перевод взяли? Говорят обычно
дочерний класс


Работать могу с методами в two
скорее все таки с методами one, т.к. one родительский класс. А смысл в том что можно нужный нам функционал предоставить на реализацию дочерним классам, и не задумываться как они там его будут реализовывать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы