Интерфейс и реализация

Идеи Парнаса в терминах объектов:

  • Объявление класса должно обеспечивать клиента информацией, необходимой для успешной работы и ни какой другой.
  • Методам должна быть доступна вся информация, необходимая для выполнения их обязанностей, и никакая другая.

Принцип Парнаса делит мир на две части. Имеется внешний образ наблюдаемый пользователем объекта, и мы будем называть это представление об объекте интерфейсом. (interface), оно описывает как объект взаимодействует с внешним миром. Обратная сторона объекта связана с его реализацией (implementation). Пользователю разрешен доступ только к тому, что описано в интерфейсной части. Реализация определяет, как достигается выполнение обязанностей, заявленных в интерфейсной части.

Классы и методы в языке C++

Классы С++ предлагают расширение предопределенных системных типов. Класс - это определяемый пользователем тип. Каждый класс представляет уникальное множество объектов и операций над ними (методов). Класс предоставляет средства для создания, манипулирования и уничтожения таких объектов.
Что представляет собой хороший класс? Нечто, имеющее небольшое и хорошо определенное множество действий. Нечто, что можно рассматривать как "черный ящик", которым манипулируют только посредством этого множества действий. Нечто, чье фактическое представление можно любым мыслимым способом изменить, не повлияв на способ использования множества действий. Нечто, чего можно хотеть иметь больше одного.
В общем случае, класс представляется в следующей форме:

сlass имя класса{список членов};

Описание класса начинается с ключевого слова class. Список членов класса определяет собственные элементы класса.
При описании членов классов возможно указание атрибутов управления доступом к элементам классов. Такими атрибутами являются:

  • public: члены класса видны извне класса
  • private: соответствующие элементы могут использоваться только внутри класса

По умолчанию элементы класса имеют тип private. Указанный в описании спецификатор доступа распространяется на все последующие определения, пока не встретится другой спецификатор.

Поскольку пользователя часто интересует открытая часть класса, то в описании она должна идти первой.

Функция card(suit,int) в описании класса является уникальной – она имеет тоже имя, что и класс и не имеет возвращаемого значения. Эта функция называется конструктором. Она используется при инициализации создаваемых экземпляров класса. Методы draw и halfdraw описаны в стиле прототипа функции.

Листинг 3.1 Описания класса card на C++
enum suits {diamond, club, heart, spade};
enum colors {red, black};
class card {
public:
card(suits,int);
// доступ к атрибутам
colors color ();
bool faceUp ();
int rank ();
suits suit ();
// выполняемые действия
void draw (window &,int x, int y);
void halfdraw (window &,int x, int y);
void flip ();
private:
bool faceup;
int r; // ранг
suits s; // масть
};
Метод suit возвращает значение масти в s. А rank значение ранга r.

Файл для реализации данного класса должен обеспечить работу методов, описанных в интерфейсном файле.
#include “card.h”
card::card(suits sv, int rv)
{
s=sv; // масть инициализируется
r=rv; // ранг инициализируется
faceup=true; // начальное положение картинкой вверх
}
int card::rank() { return r; }

Комбинация имени класса и имени метода образует полное имя.

При программировании с использованием классов очень часто используется много маленьких функций. Это может страшно понизить эффективность, потому что стоимость вызова функции (хотя и вовсе не высокая по сравнению с другими языками) все равно намного выше, чем пара ссылок по памяти, необходимая для тела функции. Чтобы справиться с этой проблемой, был разработан аппарат inline-функций (встраиваемые функции). Компилятор преобразует вызов функции в ее код. Функция, определенная (а не просто описанная) в описании класса, считается inline. Кроме того, функцию можно определить с ключевым словом inline вне протокола класса.

inline int card::rank() { return r; }

Листинг 3.2. Описание класса card с inline методами
class card {
public:
// конструкторы
card(suits,int);
card();
card(const card &c);
// доступ к атрибутам
colors color ();
bool faceUp () {return faceup; }
int rank () { return r; }
suits suit () { return s; }
// выполняемые действия
void draw (window &, int x,int y);
void halfdraw (window &,int x, int y);
void flip () { faceup =!faceup; }
private:
bool faceup;
int r; // ранг
suits s; // масть
};
Многие компиляторы требуют описание переменных, используемых во встраиваемых функциях, до определения функций. Поэтому либо переносят поля private до public, либо выносят встраиваемые функции в файл реализации с описателем inline.
Язык С++ поддерживает неполное описание классов: class X. Неполное описание класса позволяет использовать ссылки на эти классы до их полного определения. Объекты типа класс могут использоваться как аргументы функций и как возвращаемые функциями значения.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: