Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Технология программирования_испр.doc
Скачиваний:
37
Добавлен:
09.02.2015
Размер:
2.51 Mб
Скачать

5.5. Не объектно-ориентированные системы программирования

Прикладную программную систему, спроектированную по методологии OMT, совсем не обязательно реализовывать на объектно-ориенти-рованном языке. Рассмотрим, как объектно-ориентированный проект можно реализовать на языке C (как известно, он не является объектно-ориентированным). Проще всего это сделать, отобразив объектно-ориенти-рованные конструкции на язык C (для объектно-ориентированных языков такое отображение автоматически реализуется компилятором). Реализация состоит в выполнении следующих шагов:

  • Представить классы с помощью других структур данных (если языком реализации является C, то классы удобно представлять как структуры языка C).

  • Обеспечить передачу параметров методам.

  • Реализовать наследование.

  • Обеспечить механизм выбора нужного метода.

  • Реализовать зависимости.

  • Реализовать синхронизацию параллельных процессов.

  • Обеспечить упрятывание (инкапсуляцию) внутренних деталей реализации классов.

Рассмотрим, как можно выполнить перечисленные шаги при реализации на языке C, на примере реализации графического редактора (п. 5.2).

5.5.1. Преобразование классов в структуры данных

В языке C класс можно рассматривать как тип структуры, определённый в этом языке: поля структуры соответствуют атрибутам класса (при этом каждый атрибут может иметь простой либо составной тип, т.е. тип структуры или массива). В таком случае каждый объект некоторого класса будет представлен конкретной структурой, экземпляром соответствующего типа структуры.

Методы реализуются в виде набора функций, описания которых можно указать в комментарии при определении типа структуры, определяющего описываемый класс. Программист должен сам следить за тем, чтобы при работе с экземплярами этого типа структуры использовались для доступа к её полям только функции, перечисленные в указанном комментарии. В языке C++ это автоматически отслеживается компилятором и его подсистемой поддержки выполнения программ. Все функции, соответствующие методам, имеют дополнительный параметр, определяющий экземпляр структуры (объект), к которому применяется метод. В языке C++ этот параметр автоматически подставляется компилятором.

Например, класс Window можно представить как следующую структуру (struct) языка C:

struct Window

{

/* структура соответствует классу

* class Window

* для которого определены следующие методы (все методы имеют

* дополнительный параметр, Window* this, определяющий экземпляр

* структуры (объект), к которому применяется метод):

* public:

* Window(Length x0, Length y0, Length width, Length height,

* Window* this);

* D_Window (Window* this); -- соответствует деструктору ~Window()

* void add_box (Length x, Length y, Length width, Length height,

* Window* this);

* void add_circle (Length x, Length y, Length radius, Window* this);

* void clear_selections (Window* this);

* void cut_selections (Window* this);

* Group* group_selections (Window* this);

* void move_selections (Length deltax, Length deltay, Window* this);

* void redraw_all (Window* this);

* void select_item (Length x, Length y, Window* this);

* void ungroup_selections (Window* this);

* private:

* void add_to_selections (Shape* shape, Window* this);

*/

Length xmin;

Length ymin;

Length xmax;

Length ymax;

};

При этом предполагается, что тип Length введён через

typedef floast Length;

Ссылки на объекты класса Window реализуются как указатели языка C:

struct Window* window;

Length x1 = window->xmin;

Объект может быть при этом размещён статически, автоматически (в стеке) или динамически (в куче).