Разнородные массивы
Рассмотрим пример, иллюстрирующий полиморфизм. Имеется набор базовых операций, необходимых для покраски любого дома. Дома различных типов требуют различной технологии покраски. Например, деревянные стены можно шлифовать, а пластиковую облицовку можно мыть. В контексте объектно-ориентированного программирования эти дома представляют собой различные классы, образованные от базового класса (House) дом, который содержит общие для всех операции покраски. Технология покраски (метод Paint) ассоциируется с каждым классом.
Базовый класс House содержит идентификационную строку “дом” и виртуальный метод Paint, который распечатывает её. Каждый производный класс подменяет метод Paint и показывает тип дома, подлежащего покраске.
Дом (House)
Деревянный дом Оштукатуренный дом Дом с пластиковой
облицовкой
//базовый класс в иерархии технологий покраски домов
class House
{
private:
String id; //идентификатор дома
public:
//конструктор. присвоить идентификатору дома значение “дом”
House (void)
{
id = “дом” ;
}
//виртуальный метод. печатает символьную строку “дом”
virtual void Paint (void)
{
cout << id;
}
};
Каждый производный класс содержит символьную строку, идентифицирующую тип дома. Виртуальный метод Paint распечатывает эту строку и вызывает базовый метод Paint. Объявление класса WoodFrameHouse приводится в качестве модели. Полное описание классов домов находится в файле houses.h.
Class WoodFrameHouse: public House
{
private:
//идентификатор дома
String id;
public:
//конструктор.
WoodFrameHouse (void): House()
{
id = “деревянный”
}
//виртуальный метод распечатывает id
//и вызывает Paint базового класса
virtual void Paint (void)
{
cout << “Покрасить” << id << “ ”;
House::Paint();
}
};
Чтобы описать понятие разнородного массива, определим массив contractorList (подрядчики), состоящий из пяти указателей на базовый класс House. Массив инициализируется посредством случайной выборки. В массив заносится случайная выборка объектов, имеющих тип WoodFrameHouse (деревянный), StuccoHouse (оштукатуренный) или VinySidedHouse (пластиковый). Например, такая:
contractorList
Можно рассматривать этот массив указателей как список адресов пяти домов подлежащих покраске. Подрядчик распределяет работы по бригадам. В нашем примере подрядчик даёт каждой бригаде адрес дома и полагает, что они сообразят, как покрасить дом, когда увидят, какого он типа.
Программа 1.2. Разнородный массив
Эта программа проходит массив contractorList и вызывает метод Paint для каждого объекта. Поскольку каждый объект адресуется указателем, динамическое связываение гарантирует, что будет выполнен именно тот Paint, который нужен. Это соответствует выписыванию наряда на малярные работы.
#include <iosream.h>
#include “random.h” //датчик случайных чисел
#include “houses.h” //иерархия покрасочных технологий
void main (void)
{
//динамический список адресов объектов
House *contractorList [5];
RandomNumber rnd;
//построить список пяти домов, подлежащих покраске
for (int i=0; i<5; i++)
//выбрать случайным образом дом типа 0, 1 или 2
//создать объект и занести его адрес в contractorList
switch (rnd.Random (3))
{
case 0: contractorList [i] = new WoodFrameHouse;
break;
case 1: contractorList [i] = new StuccoHouse;
break;
case 2: contractorList [i] = new VinySidedHouse;
break;
}
//покрасить дома с помощью метода Paint.
//поскольку он виртуальный
//используется динамическое связывание и вызывается
//правильный метод
for (i=0; i<5; i++)
contractorList [i] -> Paint ();
}
/*
<Прогон программы 1.2>
Покрасить деревянный дом
Покрасить оштукатуренный дом
Покрасить пластиковый дом
Покрасить оштукатуренный дом
Покрасить деревянный дом
*/