Объектно-ориентированное программирование. Основными свойствами ООП являются инкапсуляция, наследование и полиморфизм
Свойства ООП
Основными свойствами ООП являются инкапсуляция, наследование и полиморфизм. Ниже кратко поясняется их смысл, а полное представление о них можно получить после изучения этой и следующей лекций.
Объединение данных с функциями их обработки в сочетании со скрытием ненужной для использования этих данных информации называется инкапсуляцией ( encapsulation ). Инкапсуляция повышает степень абстракции программы: данные класса и реализация его функций находятся ниже уровня абстракции, и при написании программы информация о них не нужна. Кроме того, инкапсуляция позволяет изменить реализацию класса без модификации основной части программы, если интерфейс остался прежним (например, при необходимости сменить способ хранения данных с массива на стек).
Инкапсуляция позволяет использовать класс в другом окружении и быть уверенным, что класс не испортит не принадлежащие ему области памяти, а также создавать библиотеки классов для применения во многих программах.
Наследование - возможность создания иерархии классов, когда потомки наследуют все свойства своих предков, могут их изменять и добавлять новые. Свойства при наследовании повторно не описываются, что сокращает объем программы. Выделение общих черт различных классов в один класс-предок является мощным механизмом абстракции - ведь и любая наука начинается с абстрагирования и классификации, которые помогают справиться со сложностью рассматриваемой предметной области.
|
|
Иерархия классов представляется в виде древовидной структуры, в которой более общие классы располагаются ближе к корню, а более специализированные - на ветвях и листьях. В С++ каждый класс может иметь сколько угодно потомков и предков. Иногда предки называются надклассами или суперклассами, а потомки - подклассами или субклассами.
Третьим китом, на котором стоит ООП, является полиморфизм - возможность использовать в различных классах иерархии одно имя для обозначения сходных по смыслу действий и гибко выбирать требуемое действие во время выполнения программы.
Понятие полиморфизма используется в С++ весьма широко. Простым примером полиморфизма может служить перегрузка функций, когда из нескольких вариантов выбирается наиболее подходящая функция по соответствию ее прототипа передаваемым параметрам. Другой пример - использование шаблонов функций, когда один и тот же код видоизменяется в соответствии с типом, переданным в качестве параметра. Чаще всего понятие полиморфизма связывают с механизмом виртуальных методов.
Использование при программировании понятий, более близких к предметной области, благодаря представлению программы в терминах поведения объектов является большим преимуществом ООП. Однако проектирование такой программы представляет собой весьма сложную задачу, поскольку в процесс добавляется еще один важный этап - разработка иерархии классов.
|
|
Плохо спроектированная иерархия приводит к созданию сложных и запутанных программ. Важно до начала проектирования правильно определить, требуется ли вообще применять объектно-ориентированный подход. Если в иерархии классов нет необходимости, то, как правило, достаточно ограничиться модульной технологией.
Критические секции
В операционных системах Windowsпроблема взаимного исключения для параллельных потоков, выполняемых в контексте одного процесса, решается при помощи объекта типа critical_section, который не является объектом ядра операционной системы. Для работы с объектами типа critical_sectionиспользуются следующие функции:
// инициализация критической секции
VOIDInitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection); // вход в критическую секцию
VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// попыткавойтивкритическуюсекцию
BOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// выходизкритическойсекции
|
|
VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
// разрушениеобъектакритическаясекция
VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
Каждая из этих функций имеет единственный параметр, указатель на объект типа CRIТ 1CAL_SЕС ТION. Все ЭТИ фуНКЦИИ, за исключением TryEnterCriticalSection, не возвращают значения. Функция TryEnterCriticalSectionвозвращает ненулевое значение, если поток вошел в критическую секцию или уже находится в ней, в противном случае функция возвращает значение false. Отметим также, ЧТО функция TryEnterCriticalSectionподдерживается только операционной системой Windows2000.
Пример работы несинхронизированных потоков
#include<windows.h>
#include <iostream.h>
DWORD WINAPI thread(LPVOID)
{
int i,j;
for (j = 0; j < 10; ++j)
{
// выводимстрокучиселj for (i = 0; i < 10; ++i)
{
cout « j « ' ' « flush;
Sleep(17);
}
cout « endl;
return 0;
}
int main()
{
int i, j ;
HANDLE hThread;
DWORD IDThread;
hThread=CreateThread(NULL/ 0; thread, NULL, 0, &IDThread); if (hThread == NULL) return GetLastError();
for (j = 10; j < 20; ++j)
{
for (i = 0; i < 10; ++i)
{
// выводим строку чисел jcout« j« ' ' « flush;
Sleep(17);
}
cout« endl;
}
// ждем, пока поток threadзакончит свою работу WaitForSingleObject(hThread, INFINITE);
return 0;
}
Дата добавления: 2018-02-28; просмотров: 354; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!