Найти в Дзене
Геннадий Шушпанов

Наследование и полиморфизм

Наследование и полиморфизм две тесно связанные концепции для работы с абстракциями. Наследование определяет отношение "является" между абстракциями с разной степенью детализации, а полиморфизм определяет способы оперирования абстракциями. В программировании обычно выделяют три формы полиморфизма, которые различаются тем, что абстрагируется. Абстракция объектов через наследование. Все автомобили едут, все самолеты летают, а любой документ можно напечатать. В этом примере автомобиль, самолет или документ -- абстракция, определяющая общее поведение для реальных объектов. В программе мы для абстракций создаем классы, либо реализующие общее поведение, либо позволяющие это сделать наследным классам. Имея такой абстрактный класс мы можем использовать его поведение, не уточняя класс наследника -- ехать может и легковой и грузовой автомобили. Это работает и в другую сторону. Поведение базового класса доступно наследнику: грузовик может ехать, поскольку он автомобиль. В приведенном примере легко
Оглавление

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

Полиморфизм объектов

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

В приведенном примере легковой автомобиль и грузовик наследуют общее поведение для движения и детализируют запрос массы.

Полиморфизм типов

Абстракция типа. С появлением обобщенных процедур мы получили возможность абстрагироваться от конкретного типа используемых в алгоритме переменных. Однако есть нюанс -- без наследования набор операций доступных обобщенной процедуре невелик: присвоить, извлечь и проверить на равенство -- вот и весь выбор. Хотите больше -- уточняйте тип. В примере показано, как с помощью обобщенной процедуры вычислять eˣ для разных числовых типов.

-2

INumber в данном случае та абстракция типа, которая определяет набор доступных операций и базовых констант.

Полиморфизм параметров

Абстракция операций. Была всегда. WRITE в Фортране или printf в C позволяли использовать параметры любого типа и в "любом" количестве. Печалило то, что своих таких функций было не написать. Но пришли иные времена и перегрузка функций решила эту проблему. Важно понимать, в случае перегрузки функции мы абстрагируем идею, цель операции -- все они должны поддерживать одну идею и вести к единой цели. Эта форма полиморфизма не опирается на наследование.

-3

В примере, для легкового автомобиля и грузовика, определены свои функции печати массы автомобиля. Наследование не симметрично, вариант для Car не определен, поэтому напрямую PrintCarMass с классом Car работать не может. Используя приведение к dymamic мы можем отложить определение типа переменной до времени исполнения, когда конкретный тип может быть определен, а, следовательно, может быть определена и соответствующая функция. Такой вот отложенный полиморфизм.

Мономорфизм

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

-4

Методы посадки и высадки пассажиров связаны с поведением только легкового автомобиля и не могут быть использованы в полиморфных функциях опирающихся на абстракцию автомобиля.

Интерфейсы

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

-5