Зависимость.
Объектно-ориентированное программирование
Использование шаблонов реализует в языке С++ особый тип полиморфизма — параметрический полиморфизм. Теперь мы можем использовать один и тот же шаблон для целых и вещественных чисел. Префикс template делает Тype параметром объявления, которому этот префикс предшествует. В языке С++ можно определять шаблоны не только классов, но и функций. Typedef Stack IntStack // синоним класса стеков целых чисел. Читать ещё >
Зависимость. Объектно-ориентированное программирование (реферат, курсовая, диплом, контрольная)
Пример. Пусть управление температурой каждый объект класса Controller осуществляет в соответствии с задаваемым ему планом. План представим в виде экземпляра класса Plan.
class Plan;
class Controller{.
.. .
void process (Plan&);
.. .
};
Класс Plan упомянут как часть описания функции-члена process; это дает нам основание сказать, что класс Controller пользуется услугами класса Plan.
Отношение зависимости (использования) между классами означает, что изменение в спецификации одного класса может повлиять на другой класс, который его использует, причем обратное в общем случае неверно. Можно сказать, что один из классов (клиент) пользуется услугами другого (сервера).
Один класс может использовать другой по-разному. В нашем примере это происходит при описании интерфейсной функции. Отношение использования также имеет место, если в реализации какой-либо операции происходит объявление локального объекта используемого класса.
Инстанцирование
Пример. Представим, что нам необходимы стек целых чисел и стек контроллеров, управляющих температурой. Мы могли бы описать два стека:
class IntStack {.
int stack[100];
.. .
};
class ControllerStack {.
Controller* stack[100];
.. .
};
Другой, более разумный, подход — создать универсальный стек, который мог бы хранить элементы любого нужного нам типа. Для этого мы можем описать стек, содержащий указатели на нетипизированные элементы:
class Stack {.
void* stack[100];
... };
Однако это не безопасно с точки зрения типов. Никто не гарантирует нам, что пользователь не поместит в стек элемент одного типа, а взять захочет элемент другого типа.
Для реализации нашей идеи необходимо воспользоваться шаблоном или параметризованным классом. Шаблон служит для построения других классов и может быть параметризован другими классами, объектами или операциями.
Использование шаблонов реализует в языке С++ особый тип полиморфизма — параметрический полиморфизм.
template class Stack {.
Тype stack[100];
.. .
public:
void push (Тype);
Т рор ();
.. .
};
Префикс template делает Тype параметром объявления, которому этот префикс предшествует.
Инстанцирование — подстановка фактических параметров шаблона вместо формальных. В результате создается конкретный класс, который может иметь экземпляры.
Объявим нужные нам стеки:
typedef Stack IntStack // синоним класса стеков целых чисел.
typedef Stack ControllerStack // синоним класса стеков.
// контроллеров.
IntStack IS; // стек для целых чисел.
ControllerStack CS; // стек для контроллеров Объекты IS и CS — это экземпляры совершенно различных классов, которые даже не имеют общего суперкласса. Тем не менее они получены из одного параметризованного класса Stack.
Инстанцирование безопасно с точки зрения типов. По правилам C++ будет отвергнута любая попытка поместить в стек или извлечь из него что-либо, кроме целых чисел или указателей на экземпляры класса Controller, соответственно.
В языке С++ можно определять шаблоны не только классов, но и функций.
В качестве примера рассмотрим определение шаблона функции, служащей для определения максимального из двух элементов.
template Тype max (Тype x, Тype y){.
return (x > y)? x: y;
};
Теперь мы можем использовать один и тот же шаблон для целых и вещественных чисел.
int i, j, k;
double a, b, c;
.. .
k = max (i, j);
c = max (a, b);
Кроме того, возможно использовать этот шаблон и для объектов некоторого класса, если в нем определена операция «>» .