Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КЛ_ТехнолПрогр2010_090103.doc
Скачиваний:
22
Добавлен:
27.04.2019
Размер:
1.35 Mб
Скачать

4.3. Проектирование файлов интерфейсов классов

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

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

Правило 2. Разработчик программы должен знать только требуемое поведение объекта и ничего кроме этого.

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

Файл интерфейса базового класса

Спроектируем базовый класс Cindex. Поместим структуру tip_index в часть private, т.к. она используется только элементами-функциями данного класса, а элементы-функции - в часть public, т.к. они используются в классах CAkt, CCena.

Спроектируем прототипы элементов-функций класса ind:

- void init_ind(int, CString); - инициализирует элемент индексного массива; принимает номер записи и значение ключа;

- void init_kol(int); - инициализирует кол-во элементов массива;

- int dob_ind(CString); - поиск номера добавляемой записи; принимает значение ключа записи, возвращает номер записи;

- int poisk_ind(CString, int, int&); - поиск номера искомой записи; принимает значение ключа записи, индекс элемента начала поиска; возвращает номер записи и индекс элемента;

- void cor_ind(int, CString); - корректирует элемент индексного массива; принимает индекс элемента и ключ записи.

//Файл заголовков Index.h

#ifndef index_h

#define index_h

#include <string.h>

const int max_mass=1000;

class Cindex //определение базового класса

{

public:

int kol; //общее кличество записей файла

int fact_kol; //количество заполненных записей

private:

struct tip_index

{

CString kluch;

int nomer;

} index[max_mass];

public:

CIndex();

~CIndex();

int razm_zap;

void init_ind(int,CString);

void init_kol(int);

int dob_ind(CString);

int poisk_ind(CString,int,int&);

void cor_ind(int,CString);

};

#endif

Файлы интерфейсов производных классов

Рассмотрим производные классы akt и cena. Элементы-функции Init(), Sozdanie(), Zamena(), Udalenie(), Zapiszap(), ChtenieZap() будут вызываться через объект класса, и ,согласно правилам доступа, должны быть расположены в части public.

А почему выбран атрибут наследования public ? Если выбрать private, то элементы-функции класса ind становятся в классах akt и cena - private. Доступ к ним в этих классах еще есть, но они становятся закрытыми для дальнейшего наследования. А ведь функция sozdanie(), выполняющая обработку двух файлов, должна использовать элементы класса ind. Поэтому, надо public.

//Файл Akt.h

#ifndef akt_h

#define akt_h

#include "Index.h"

class CAkt : public CIndex

{

public:

CString Tabn; //10 байтов

CString Razrjad; //10 байтов

CString VidRab; //5 байтов

CString Objem; //10 байтов

public:

void ZapisZap(int nomer);//запись записи в файл

void ChtenieZap(int nomer);//чтение записи из файла

void Sozdanie();//добавление новой записи

void Init(); //создание индексного массива

void Udalenie(int nomer);//удаление записи

void Zamena(int nomer);//замена записи

CAkt();

virtual ~CAkt();

};

#endif

//Файл Cena.h

#ifndef cena_h

#define cena_h

#include "Index.h"

class CCena : public CIndex

{

public:

CString Vid; //5 байтов

CString Rascenka; //10 байтов

public:

void Udalenie(int nomer);

void Zamena(int nomer);

void Init();

void Sozdanie();

void ChtenieZap(int nomer);

void ZapisZap(int nomer);

CCena();

virtual ~CCena();

};

#endif