Объектно-ориентированное проектирование с примерами


Механизм покадровой обработки - часть 2


Sampler sampler;

void acquire(Tick t)


{

sampler.sample(t);

}

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

main() {

Timer::setCallback(acquire);


Timer::startTiming();


while(1);


return 0;

}

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

Продолжим рассмотрение нашей задачи. Определим теперь внешний интерфейс класса Sensors (датчики). Мы предполагаем, что существуют различные конкретные классы датчиков:

class Sensors : protected Collection {


public:

Sensors();


virtual ~Sensors();


void addSensor(const Sensor& SensorName, unsigned int id = 0);


unsigned int numberOfSensors() const;


unsigned int numberOfSensors(SensorName);


Sensor& sensor(SensorName, unsigned int id = 0);

protected:


};

Это, в основном, класс-коллекция и поэтому он объявляется подклассом фундаментального класса Collection. Класс Collection указан как защищенный суперкласс; это сделано для того, чтобы скрыть детали его строения от клиентов класса Sensor. Обратите внимание на то, что набор операций, который мы определили для класса Sensors, крайне скуден - это вызвано ограниченностью задач класса. Мы, например, знаем, что датчики могут добавляться в коллекцию, но не удаляться из нее.

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

Вернемся к спецификации класса Sampler. Нам надо обеспечить его ассоциацию с классами Sensors и DisplayManager:

class Sampler {


public:

Sampler(Sensors&, DisplayManager&) ;

protected:

Sensors& repSensors;


DisplayManager& repDisplayManager;




Начало  Назад  Вперед