Под концепцией объектно-ориентированного программирования (ООП) подразумевается, что управление процессом реализации программ осуществляется через передачу сообщений объектам. В связи с этим объекты определяются совместно с сообщениями, на которые они при выполнении программ должны реагировать. В этом заключается основное отличие ООП от процедурного программирования, в котором отдельно определенные структуры данных передаются в качестве параметров в процедуры (функции). Таким образом, в состав объектно-ориентированной программы входят объекты – отдельные фрагменты кода, который обрабатывает данные, взаимодействующие друг с другом через определенные интерфейсы.
Основной целью ООП является повышение эффективности разработки программ.
Появление ООП было связано с наблюдениями, что компьютерные программы являются описанием действий, которые выполняются над различными объектами, в качестве которых выступают, например, совокупности числовых значений, графические объекты, записи в базах данных. В традиционных методах программирования, чтобы изменить данные или правила и методы их обработки, необходимо было значительно изменить саму программу.
Использование же ООП позволило свести необходимые модификации программ к их дополнению и расширению.
К свойствам объектно-ориентированного языка программирования относят:
- Абстракцию данных, заключающуюся в выделении значимой информации о свойствах или качествах предмета путем мысленного удаления незначимой информации.
- Инкапсуляцию, являющуюся механизмом объединения данных и кода, манипулирующего ими и защищающего их от некорректного использования и внешних помех.
- Наследование, т.е. процесс, с помощью которого одним объектом приобретаются свойства другого.
- Полиморфизм – свойство, позволяющее использовать один и тот же интерфейс для общего класса действий.
При разработке объектно-ориентированных программ осуществляется выполнение последовательности следующих работ:
- Определяются основные объекты, необходимые для решения конкретной задачи.
- Определяются закрытые данные (данные состояния) для каждого из выбранных объектов.
- Определяются второстепенные объекты и их закрытые данные.
- Определяется иерархическая система классов, которая представляет выбранные объекты.
- Определяются ключевые сообщения для обработки объектов каждого класса.
- Разрабатывается последовательность выражений, позволяющих решить поставленную задачу.
- Разрабатываются методы обработки сообщений.
- Очистка проекта от всех вспомогательных промежуточных материалов, которые использовались в ходе проектирования.
- Кодирование.
- Отладка.
- Компоновка.
- Тестирование.
Используя ООП, программист осуществляет моделирование объектов определенной предметной области посредством программирования их поведения и содержания в пределах класса.
С помощью конструкции «класс» обеспечивается механизм инкапсуляции, реализующий абстрактные типы данных. Инкапсуляцией как бы скрываются подробности внутренней реализации типов и внешние, допустимые для выполнения над объектами этого типа операции и функции.
Объекты
Понятие объекта является базовым в ООП. Объект обладает определенными свойствами. Состояния объекта задаются значениями его признаков. Объект располагает методами решения задач.
Программа, созданная с помощью ООП, состоит из объектов, взаимодействующих между собой.
Объектный тип в отличие от типа «запись» содержит не только поля, описывающие данные, но и функции и процедуры, описание которых содержится в описании объектов. Эти функции и процедуры называются методами.
Поля объекта доступны методам. Методы и их параметры, как правило, определены в описании объекта, а их выполнение указывается в месте программы, предшествующем вызову данного метода.
В описаниях объектов фактически содержаться только шаблоны обращений к методам, необходимые компилятору для проверки при обращении к методам соответствия количества параметров и их типов.
Инкапсуляция
Инкапсуляция - это важнейшее свойство объектов, на котором строится ООП. Смысл инкапсуляции заключается в том, что объектом скрываются детали, несущественные для его использования. Инкапсуляция представляет собой средство организации доступа к данным лишь через соответствующие методы.
Наследование
Наследование также является базовым понятием объектно-ориентированного программирования. Оно позволяет определять новые объекты, используя при этом свойства прежних, изменяя или дополняя их. Объекты-наследники получают все методы и поля «родителя», к которым могут добавлять свои собственные методы и поля или заменять («перекрывать») их своими методами.
Привлекательность наследования заключается в возможности использования уже определенных и отлаженных объектов в других программах. Причем если новая задача отлична от предыдущей и возникает необходимость модификации данных или методов их обработки программист может использовать результаты предыдущей работы, применив механизм наследования. Таким образом, часть работы будет выполнена, что сократит время на разработку новой программы.
Виртуальные методы
Используя наследование можно создать иерархические, связанные отношениями подчинения, структуры данных. Однако при этом могут возникнуть проблемы. Например, когда у двух объектов имеются унаследованные ссылки на методы, причем одна из них может оказаться ссылкой на устаревшую версию метода и не сработать.
Решить подобную проблему можно используя виртуальный метод. Связь между виртуальными методами и вызывающими их процедурами устанавливается не во время трансляции (раннее связывание), а во время выполнения программы (позднее связывание).
Для использования виртуального метода нужно в описании объекта после заголовка метода добавить ключевое слово virtual. При этом заголовки виртуальных методов наследника и родителя должны точно совпадать.
Инициализацию экземпляра объекта, который имеет виртуальные методы, выполняют с помощью специального метода – конструктора, который обычно полям объекта присваивает начальные значения и затем выполняет остальные действия по инициализации объекта. В заголовке метода-конструктора слово procedure заменяют словом constructor. Обратные действия выполняет другой специальный метод – деструктор, который описывают словом destructor.
Конструктор подготавливает позднее связывание, создавая при этом указатель на таблицу виртуальных методов, используемую в дальнейшем для поиска методов. В этой таблице содержатся адреса всех виртуальных методов. Когда вызывается виртуальный метод, по его имени определяется адрес, по которому затем передается управление.
Каждый объектный тип имеет свою собственную таблицу виртуальных методов, это позволяет одним и тем же операторам вызывать разные процедуры. При наличии нескольких экземпляров объектов одного типа, каждый объект должен иметь свой собственный конструктор, вызываемый для каждого экземпляра, иначе возможен сбой в программе.