Здесь мы рассмотрим очень приближенную модель того, что реально происходит при программировании в объектно-ориентированных библиотеках, основанных на обработке сообщений (или событий) объектами программы. (Например, OWL в Windows или Turbo Vision в DOS) . Система объектов, управляемых сообщениями, должна включать в себя несколько классов, взаимодействие между которыми скрыто от внешнего наблюдателя :
-класс сообщений ;
-базовый класс объектов, управляемых сообщениями ;
-класс прикладной программы, единственный объект которого является аналогом main и реализует в своем методе run диспетчер сообщений и объектов.
Прежде всего, вводится понятие сообщения - как единственной и универсальной единицы обмена данными между объектами. Сообщение не является адресным, поскольку объекты не располагают информацией ни своем количестве, ни о своем расположении. Вместо этого в сообщение вводится код или вид сообщения. Кроме того, сообщение в зависимости от кода может нести данные и указатель на область памяти (например, объект может передать указатель на самого себя).
// Класс сообщений -----------------------------------
#define ms_NULL 0 // Пустое сообщение
#define ms_KEYB 1 // Символ клавиатуры
#define ms_TICK 2 // Тик таймера
#define ms_MS_MOVE 3 // Перемещение мыши
#define ms_MS_CLICK 4 // Кнопка мыши
#define ms_ECHO 5 // Ответ объекта с this
#define ms_EXIT 6 // Завершение программы
#define ms_KILL 7 // Уничтожение объекта
#define ms_BORN 8 // Порождение объекта
class MS
{
public:
char code; // Код сообщения
int x,y; // Параметры сообщения
void *p; // Указатель на данные
MS(char,int,int,void *); // Констуктор - создать сообщение
~MS();
void clear()
{ code=ms_NULL; }; // " Очистить" сообщение
};
MS::MS(char c,int xx,int yy,void *q)
{ code = c; x = xx; y = yy; p = q; }
MS::~MS() {}
Все взаимодействующие элементы программы должны быть объектами, производными от одного общего класса - класса объектов, управляемых сообщениями.