Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лекции 2010.doc
Скачиваний:
69
Добавлен:
17.03.2015
Размер:
954.37 Кб
Скачать
    1. Основные средства разработки классов

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

Наследование. Наследование - отношение между классами, обеспечивающее возможность конструирования новых более сложных классов из уже имеющихся посредством добавления полей и определения новых методов. Реализацию этой возможности обеспечивает совокупность специальных средств языка программирования - механизм наследования. Этот же механизм позволяет классу-потомку использовать («наследовать») поля и методы одного или нескольких родительских классов.

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

      1. Иерархии классов при различных видах наследования

Поскольку при наследовании каждый производный класс добавляет новые поля и/или методы, в иерархическом дереве классов по мере удаления от корня располагаются все более сложные классы, экземплярами которых будут объекты с более сложной структурой и поведением.

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

Класс Окно_меняющее_цвет -родитель: класс Окно:

метод Изменить_цвет(аCо1оr);

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

Класс Окно_меняющее цвет содержит все поля родительского класса и все его методы. Дополнительно объекты типа Окно_меняющее_цвет могут менять цвет окна на указанный в сообщении «Изменить_цвет» (Рис. 2.2.).

      1. Иерархия классов Окно и Окно_меняющее_цвет

При множественном наследовании, реализованном, например в C++, наследуются поля и методы всех родителей. В том случае, если среди родителей есть классы, принадлежащие одной иерархии, происходит дублирование полей и методов, наследуемых от общих родителей. Для того чтобы избежать неоднозначности, в C++ введено понятие виртуального наследования, при использовании которого виртуально наследуемые поля и методы не дублируются (более подробное описание и примеры см. в § 3.3).

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

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

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

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

Примечание. Термин «полиморфизм» в программировании, в соответствии со своим изначальным смыслом («многообразие»), используется для обозначения встроенного механизма определения соответствия кода функции типу параметров. Такой механизм реализуется не только в средствах ООП.

Различают несколько терминов, связанных с конкретными механизмами реализации полиморфизма для различных случаев:

чистый полиморфизм - используется для обозначения того, что один код функции может по-разному интерпретироваться в зависимости от типа аргументов; используется в языках высокого уровня абстракции, например, в языке Lisp или Smalltalk;

перегрузка (полиморфные имена функций) - используется, когда определяется несколько функций с одним именем - одно и то же имя функции может многократно использоваться в разных местах программы; выбор нужной функции может определяться типами аргументов, областью видимости (внутри модуля, файла, класса и т. д.); если выбор определяется типом аргументов, то перегрузка называется параметрической', например, язык C++ позволяет разработчику выполнять параметрическую перегрузку функций как вне классов, так и внутри;

переопределение - используется в ООП при необходимости задания различных реализаций одноименных методов в иерархии классов; различают:

а) простой полиморфизм - конкретный метод определяется типом объекта при компиляции программы (раннее связывание); одноименные методы при использовании простого полиморфизма называют статическими полиморфными;

б) сложный полиморфизм (полиморфные объекты) - конкретный метод определяется типом объекта при выполнении программы (позднее связывание); одноименные методы при использовании сложного полиморфизма называют виртуальными полиморфными (рассмотрены далее);

обобщенные функции или шаблоны - используется в ООП при реализации в языке параметризованных классов (например, в C++), параметрами такого класса являются типы аргументов методов класса (рассмотрены далее).

        1. Простой полиморфизм (класс Окно_с_текстом). Пусть необходимо разработать на базе класса Окно класс Окно_с_текстом. Для этого к полям класса Окно необходимо добавить специальные поля для определения координат первой буквы текста - Xt, Yt и поле, содержащее сам текст - Text.

Кроме того, понадобится специальный метод, который будет обрабатывать сообщение «Нарисовать». Однако у нас уже существует родительский метод Изобразить (!), который обрабатывает это сообщение. Следовательно, необходимо заменить родительский метод методом потомка. Механизм простого полиморфизма позволяет для класса-потомка Окно_с_текстом предусмотреть собственный метод Изобразить (Рис. 2.3.).