Основные средства разработки классов
Языки, поддерживающие ООП, существенно облегчают разработчику создание новых классов за счет реализации механизмов наследования, композиции, наполнения и полиморфизма.
Наследование.В ООП существует возможность конструирования новых более сложных классов из уже имеющихся посредством добавления полей и определения новых методов (принцип иерархичности). При этом исходный класс, на базе которого выполняется конструирование, часто называется родителем, а производный - потомком. Специальный механизм наследования обеспечивает классу-потомку возможность использования полей и методов одного или нескольких родительских классов.
Если непосредственный родитель единственный, то наследование называется простым, а, если таких классов несколько - то множественным. При этом класс родитель (или классы родители) и класс потомок образуют иерархию
Рис.6. Иерархия классов при различных видах наследования
Пример. класс, переменные которого используются для изображения на экране цветного прямоугольника заданного цвета и размера (рис. 7)
.
Рис. 7. Вид и параметры окна на экране
Проектируемый класс должен содержать поля для сохранения параметров окна: x1, y1, x2, y2 - координаты верхнего левого и нижнего правого углов и Color – цвет.
Тогда класс будет иметь следующую структуру:
Класс Окно:
поляX1,Y1,X2,Y2, Color
методИнициализировать(aX1,aY1,aX2,aY2,acolor)
методИзобразить
Конец описания.
Построим на базе класса Окно класс-потомок, который может изменять цвет окна на экране. Для этого к родительскому классу достаточно добавить метод изменить_цвет:
Класс Окно_меняющее_цвет – родитель: класс Окно:
методизменить_цвет(acolor);
Конец описания.
Класс Окно_меняющее_цвет содержит все поля родительского класса и все его методы. Дополнительно объекты типа Окно_меняющее_цвет могут менять цвет окна на указанный в сообщении «Изменить_цвет» (рис. 8).
Рис 8. Иерархия классов Окно и Окно_меняющее_цвет
При множественном наследовании, реализованном, наследуются поля и методы всех родителей. В том случае, если среди родителей есть классы принадлежащие одной иерархии, происходит дублирование полей и методов, наследуемых от общих родителей. Для того чтобы избежать неоднозначности, во многих ОО-языках введено понятиевиртуальногонаследования, при использовании которого виртуально наследуемые поля и методы не дублируются.
Таким образом, в иерархическом дереве классов по мере удаления от корня мы встречаете все более сложные классы, экземплярами которых будут объекты с более сложной структурой и поведением.
В настоящее время созданы библиотеки наиболее часто встречающихся классов, которые можно использовать вновь и вновь, строя на их основе классы для решения различных задач.
Простой полиморфизм.
При создании иерархии классов может обнаружиться, что некоторые свойства объектов, сохраняя название, изменяются по сути. Для реализации таких иерархий в языке программирования должен быть предусмотрен механизмполиморфизма, обеспечивающийвозможностьзадания различных реализаций некоторого единого по названию метода для классов различных уровней иерархии. В ООП такой полиморфизм называется простым, а методы, имеющие одинаковое название - статическими полиморфными.Совокупность полиморфных методов с одним именем для иерархии классов образует единый полиморфный метод иерархии, в котором реализация полиморфного метода для конкретного класса представляет отдельный аспект.
Различают несколько терминов, связанных с конкретными механизмами реализации полиморфизма для различных случаев:
1) чистый полиморфизм- используется для обозначения того, что один код функции может по-разному интерпретироваться в зависимости от типа аргументов; используется в языках высокого уровня абстракции, например, в языке Lisp или Smalltalk;
2)перегрузка(полиморфные имена функций) - используется, когда определяется несколько функций с одним именем - одно и то же имя функции может много кратно использоваться в разных местах программы; выбор нужной функции может определяется типами аргументов, областью видимости (внутри модуля, файла, класса и т.д.); если выбор определяется типом аргументов, то перегрузка называется параметрической; например, язык С++ позволяет разработчику выполнять параметрическую перегрузку функций вне классов;
переопределение - используется в ООП при необходимости задания различных реализаций одноименных методов в иерархии классов; различают:
а) простой полиморфизм– конкретный метод определяется типом объекта при компиляции программы (раннее связывание); одноименные методы при использовании простого полиморфизма называются статическими полиморфными;
б) сложный полиморфизм (полиморфные объекты) – конкретный метод определяется типом объекта при выполнении программы (позднее связывание); одноименные методы при использовании сложного полиморфизма называются виртуальными полиморфными ;
обобщенные функции или шаблоны - используется в ООП при реализации в языке параметризованных классов (например, в С++), параметрами такого класса являются типы аргументов методов класса .
Приведем пример простого полиморфизма (класс Окно_с_текстом)
Пусть необходимо разработать на базе класса Окно класс Окно_с_текстом. Для этого к полям класса Окно необходимо добавить специальные поля для определения координат первой буквы текста - Xt, Yt и поле, содержащее сам текст - Text. Кроме этого, понадобится специальный метод, который будет обрабатывать сообщение «Нарисовать». Однако у нас уже существует родительский метод Изобразить (!), который обрабатывает это сообщение. Следовательно, необходимо заменить родительский метод методом потомка. Механизм полиморфизма позволяет для класса-потомка Окно_с_текстом предусмотреть собственный метод Изобразить (рис. 10).
Рис. 10. Иерархия классов Окно и Окно_с_текстом
Метод Инициализировать также должен быть переопределен, так как он должен инициализировать дополнительные поля класса.
Класс Окно_с_текстом – родитель: класс Окно:
поляXt, Yt, Text
методИнициировать(aX1,aY1,aX2,aY2,aColor,aXt, aYt, aText)
методИзобразить
Конец описания.