русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Полиморфизм


Дата добавления: 2015-06-12; просмотров: 494; Нарушение авторских прав


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

Предположим, мы хотим создать векторный графический редактор, в котором нам нужно описать в виде классов набор графических прими­тивов - Point, Line, Circle, Box и т.д. У каждого из этих классов определим метод draw для отображения соответствующего примитива на экране.

Очевидно, придется написать код, который при необходимости ото­бразить рисунок будет последовательно перебирать все примитивы, на момент обрисовки находящиеся на экране, и вызывать метод draw у каж­дого из них. Человек, незнакомый с полиморфизмом, вероятнее всего, создаст несколько массивов (отдельный массив для каждого типа прими­тивов) и напишет код, который последовательно переберет элементы из каждого массива и вызовет у каждого элемента метод draw. В результате получится примерно следующий код:

//создание пустого массива, который может содержать //объекты Point с максимальным объемом 1000 Point[] р = new Point[1000];

Line[] I = new Line[1000]; Circle[] c= new Circle[1000]; Box[l b = new Box[ 1000];

//предположим, в этом месте происходит заполнение

// всех массивов соответствующими объектами

for(int i = 0; i < p.length;i++) { //цикл с перебором всех ячеек массива.

//вызов метода draw() в случае,

// если ячейка не пустая.

if(p[i]!=null) p.drawO; }

for(int i = 0; i < l.length;i++) {

if(l[i]!=null)l.draw(); }

for(int i = 0; i < c.length;i++) {

if(c[i]!=null)c.draw(); }

for(int I = 0; i < b.length;i++) {

if(b[i]!=null)b.draw(); }



Недостатком написанного выше кода является дублирование практи­чески идентичного кода для отображения каждого типа примитивов. Также неудобно то, что при дальнейшей модернизации нашего графического ре­дактора и добавлении возможности рисовать новые типы графических примитивов, например Text, Star и т.д., при таком подходе придется менять существующий код и добавлять в него определения новых массивов, а так­же обработку содержащихся в них элементов.

Используя полиморфизм, мы можем значительно упростить реали­зацию подобной функциональности. Прежде всего, создадим общий ро­дительский класс для всех наших классов. Пусть таким классом будет Point. В результате получим иерархию классов, которая изображена на рисунке 2.3.

У каждого из дочерних классов метод draw переопределен таким об­разом, чтобы отображать экземпляры каждого класса соответствующим образом.

Для описанной выше иерархии классов, используя полиморфизм, можно написать следующий код:

Point р[] = new Point[1000]; P[0] = newCircle();

р[1] = newPointO; р[2] = newBox(); р[3] = newLine();

for(int i = 0; i < p.length;i++) {

if(p[i]!=null) p.drawO; }

В описанном выше примере массив р[] может содержать любые объ­екты, порожденные от наследников класса Point. При вызове какого-либо метода у любого из элементов этого массива будет выполнен метод того объекта, который содержится в ячейке массива. Например, если в ячейке р[0] находится объект Circle, то при вызове метода draw следующим образом:

p[0].draw{) нарисуется круг, а не точка.

В заключение приведем формальное определение полиморфизма.

Полиморфизм (ро1утофЫ8т) — положение теории типов, согласно которому имена (например, переменных) могут обозначать объекты раз­ных (но имеющих общего родителя) классов. Следовательно, любой объ­ект, обозначаемый полиморфным именем, может по-своему реагировать на некий общий набор операций [2].

Рис. 2.3. Пример иерархии классов.


В процедурном программировании тоже существует понятие полимор­физма, которое отличается от рассмотренного механизма в ООП. Процедур­ный полиморфизм предполагает возможность создания нескольких проце­дур или функций с одним и тем же именем, но разным количеством или раз-

личными типами передаваемых параметров. Такие одноименные функции называются перегруженными, а само явление — перегрузкой (overloading). Перегрузка функций существует и в ООП и называется перегрузкой методов. Примером использования перегрузки методов в языке Java может служить класс PrIntWriter, который применяется, в частности, для вывода сообщений на консоль. Этот класс имеет множество методов printin, ко­торые различаются типами и/или количеством входных параметров. Вотлишь несколько из них:

void println{) // переход на новую строку

void println(boolean х) // выводит значение булевской

// переменной (true или false) void println(String х) // выводит строку - значение

//текстового параметра.

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



<== предыдущая лекция | следующая лекция ==>
Наследование | Агрегация


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.307 сек.