Выбрать главу

class Intersection;

2. Усложним ситуацию из упражнения 1. Предположим, что есть три вида водителей: таксисты, переезжающие переход на красный свет; иногородние, которые едут медленно и осторожно; и частники, которые ведут машины по-разному, в зависимости от представлений о своей "крутизне".

Также есть два вида пешеходов: местные, которые переходят улицу, где им заблагорассудится, и туристы, которые переходят улицу только на зеленый свет.

А кроме того, есть еше велосипедисты, которые ведут себя то как пешеходы, то как водители.

Как эти соображения изменят модель?

Вероятно, целесообразно начать с создания производных объектов, которые моделируют разновидности рассмотренных выше объектов:

class Local_Car : public Car...;

class Tourist_Car : public Car...;

class Taxi : public Car...;

class Local_Pedestrian : public Pedestrian...;

classTourist_Pedestrian : public Pedestrian...;

class Local_Bicycle . public Bicycle...;

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

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

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

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

На стороне клиента (помимо административного модуля) существует две основные подсистемы: интерфейс пользователя и система связей. На стороне сервера — три основные подсистемы: связей, планирования и почтового интерфейса, который объявляет пользователю об изменениях в расписании.

4. Спроектируйте интерфейсы к классам той части программы, обсуждаемой в упражнении 3, которая относится к резервированию гостиничных номеров.

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

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

Приведем прототипы перечисленных выше классов.

class Calendar_Class; // ссылка на класс

class Meeting, // ссылка на класс

class Configuration

{

   public:

      Configuration();

      ~Configuration();

      Meeting Schedule( ListOfPerson&, Oelta Time duration );

      Meeting Schedule( ListOfPerson&, Delta Time duration, Time );

      Meeting Schedule( ListOfPerson&, Delta Time duration, Room );

      ListOfPerson& People(); // открытые методы доступа

      ListOfRoom& Rooms(); // открытые методу доступа

   protected:

      ListOfRoom rooms;

      ListOfPerson people;

};

typedef long Room_ID;

class Room

{

   public:

      Room( String name, Room_ID id, int capacity. String directions description = "" );

      ~Room();

      Calendar_Class Calendar();

   protected:

      Calendar_Class calendar;

      int capacity;

      Room_ID id;

      String name;

      String directions; // где этот гостиничный номер?

      String description;

};

typedef long Person_ID;

class Person

{

   public:

      Person ( String name, Person_ID id );

      ~Person();

      Calendar_Class Calendar(); // место доступа для добавления встреч

   protected:

      Calendar_Class calendar;

      Person_ID id;

      String name;

};

class Calendar_Class

{

   public:

      Calendar_Class();

      ~Calendar_Class();

      void Add( const Meeting& ); // добавляем встречу в календарь

      void Delete( const Meeting& );

      Meeting* Lookup( Time ); // проверяем, не назначена ли уже встреча на это чис-

      Block( Time, Duration, String reason = "" );

      // резервируем время...