Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpora_ROD_pechat.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
5.2 Mб
Скачать

2. Инкапсуляция. Полиморфизм. Виртуальные функции. Чисто абстрактные базовые классы. Множественное наследование. Инкапсуляция.

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

  1. Компонент должен скрывать используемый язык программирования.

  2. Компоненты должны распространяться в двоичной форме.

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

  4. Должна быть возможность перемещать компоненты в сети, внутри одного процесса, в разных процессах на разных машинах.

Полиморфизм и виртуальные функции

Классы объектов в С++. Они инкапсулируют данные и функции, описывающие объект класса и записываются в виде

class X {

private:

<внутренняя реализация>

public:

<интерфейс с внешним миром>

};

Иерархия классов. Для построения иерархии классов используются два принципа: наследования (inheritance) и композиции. Композиция определяется через объявление объекта существующего класса в виде элемента данных нового класса. Наследование определяется как создание нового класса как типа существующего класса путем наращивания нового кода без изменения кода существующего класса. Пример композиции и наследования:

class Point { … };

class Task { … };

class Node : public Point { … Task t; …};

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

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

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

Спецификация функции в базовом классе как virtual вызываем позднее связывание (так называемое связывание во время выполнения). Если функция виртуальная в базовом классе, она виртуальная также во всех производных классах. Позднее связывание имеет место только при использовании адреса объекта базового класса, в котором функция объявляется.

Пример полиморфизма в С++. Он строится на иерархии классов духовых инструментов:

// Инструмент

class Instrument { public: virtual void play () { cout << “Instrument :: play” << endl; }};

// Духовые

class Wind : public Instrument { public: void play () { cout << “Wind :: play” << endl; }};

// Мелодия

void tune ( Instrument& i ) { i.play (); }

// Исполнение

void main () {

Wind flute; // Флейта

tune (flute); // Upcasting

}

В функции tune содержится вызов виртуальной функции play, который связывается с той реализацией, которая соответствует реальному типу объекта, используемому в качестве аргумента функции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]