Главная » Java, Структуры данных и алгоритмы » Полиморфизм

0

Дословно «полиморфизм» означает «много форм». В контексте объектно-ориентированного программирования полиморфизм обозначает спо- собность переменной объекта принимать различные формы В языках объектно-ориентированного программирования обращение к объектам осуществляется с помощью переменных ссылочного типа. Переменная ссылочного типа о содержит описание класса, объекты которого она может вызывать в рамках некоторого класса S. Это означает, что переменная о может обращаться к любому объекту класса Ту который расширяет класс S. Рассмотрим пример, когда и в классе Г, и в классе дописан метод а(). Алгоритм динамической компоновки при обращении к методу всегда начинает поиск с самого низшего, базового класса. Если переменная о вызывает объект класса Г, то при передаче сообщения о.а() будет выполнен метод а(), описанный в классе Г, а не в классе S. В данном случае говорят, что метод а() был переопределен из класса S в подкласс Т. В противном случае, если переменная о обращается к объекту класса S (отсутствующему в классе Т), то при обработке сообщения оя() программа выполнит метод а(), описанный в классе S. Преимущество полиморфизма заключается в том, что для корректного выполнения метода а() отправитель сообщения 0.а() не обязан знать, относится ли переменная о к экземпляру класса Гили класса S. Таким образом, переменная о типа ссылки на объект может быть полиморфной, то есть принимать различные формы в зависимости от особенностей классов вызываемых ею объектов. Такое свойство позволяет конкретному классу Г расширять общий класс 5, наследовать «общие» методы класса S, а также описывать методы, не указанные в классе S, применяемые для обработки специфических свойств объектов класса Т.

Некоторые языки объектно-ориентированного программирования, в том числе и Java, используют также «облегченную» форму полиморфизма, которая более точно называется перегрузкой. Перегрузка возникает в том случае, если в одном классе Т описано множество подклассов с одинаковым именем, но разными сигнатурами. Сигнатура метода содержит имя метода, тип и число передаваемых в него аргументов. Таким образом, даже при наличии в классе нескольких методов с одинаковым именем они будут различаться компилятором, если имеют различные сигнатуры. В действительности это означает разные методы. В языках программирования, использующих технологию перегрузки методов, исполняющая среда определяет, какой именно метод был вызван, осуществляя поиск во всей иерархии классов до тех пор, пока не будет обнаружен первый метод, сигнатура которого соответствует аргументам, переданным при обращении к методу. Например, пусть класс Г, в котором описан метод а(), расширяет класс U, в котором описан метод а(х,у). Если объект класса Гполучает сообщение «о.а(х,у)», это означает, что обращение происходит к методу класса U(р двумя параметрами х и у). Таким образом, о действительном полиморфизме можно говорить только в том случае, если речь идет о методах с одинаковыми сигнатурами, описанными в различных классах.

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

Источник: Гудрич М.Т. Г93 Структуры данных и алгоритмы в Java / М.Т. Гудрич, Р. Тамассия; Пер. с англ. A.M. Чернухо. — Мн.: Новое знание, 2003. — 671 е.: ил.

По теме:

  • Комментарии