Разнородные массивы

Рассмотрим пример, иллюстрирующий полиморфизм. Имеется набор базовых операций, необходимых для покраски любого дома. Дома различных типов требуют различной технологии покраски. Например, деревянные стены можно шлифовать, а пластиковую облицовку можно мыть. В контексте объектно-ориентированного программирования эти дома представляют собой различные классы, образованные от базового класса (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>

 

Покрасить деревянный дом

Покрасить оштукатуренный дом

Покрасить пластиковый дом

Покрасить оштукатуренный дом

Покрасить деревянный дом

*/