Основные средства разработки классов

Языки, поддерживающие ООП, существенно облегчают разработчику создание новых классов за счет реализации механизмов наследования, композиции, наполнения и полиморфизма.

Наследование.В ООП существует возможность конструирования новых более сложных классов из уже имеющихся посредством добавления полей и определения новых методов (принцип иерархичности). При этом исходный класс, на базе которого выполняется конструирование, часто называется родителем, а производный - потомком. Специальный механизм наследования обеспечивает классу-потомку возможность использования полей и методов одного или нескольких родительских классов.

Если непосредственный родитель единственный, то наследование называется простым, а, если таких классов несколько - то множественным. При этом класс родитель (или классы родители) и класс потомок образуют иерархию

Рис.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)

методИзобразить

Конец описания.