На этом шаге мы перечислим основные положения, лежащие в основе объектно-ориентированного программирования.
Прототипом объектно-ориентированного программирования послужил ряд средств, содержащихся в языке SIMULA-67. Но оформилось оно в самостоятельный стиль программирования в связи с появлением языка Smalltalk, первоначально предназначенного для реализации функций машинной графики и разработанного А.Кеем. Первая версия этого языка создана в 1972 г. и с тех пор построено несколько его версий.
Корни объектно-ориентированного программирования уходят в одну из ветвей логики, в которой первичным считается не отношение (как для логического программирования), а объект. По сравнению с исчислением предикатов объектно-ориентированные логические системы обладают более сложным синтаксисом и правилами вывода. С объектно-ориентированным программированием же тесно связана теория акторов.
Существуют различные мнения о том, является ли метод формирования объектов главным вопросом в объектно-ориентированном программировании, ставящим объект во главу угла. При рассмотрении объектно-ориентированных языков с позиций построения вычислительных моделей можно также считать, что существенным моментом является посылка сообщений как механизм организации вычислительного процесса [1, с.87-88]. Тем не менее, заметим, что в простейшем случае посылка сообщения эмулируется вызовом метода того или иного объекта.
Основными особенностями объектно-ориентированных языков являются [2]:
Суть данного стиля программирования выражается формулой "объект = данные + процедуры".
Итак, объект интегрирует некоторое состояние (или структуру данных) и доступные только ему механизмы изменения этого состояния. Для того, чтобы модифицировать состояние некоторого объекта, необходимо послать ему соответствующее сообщение. Действие (или метод), выполняемое (выполняемый) адресатом сообщения, касается только его самого: другие объекты не должны знать, каким образом данный объект реализует ту или иную функцию.
Объединение данных и процедур в объекте называется инкапсуляцией, и это свойство неотъемлемо присуще объектно-ориентированному программированию. Объектно-ориентированные языки программирования (TURBO Pascal, C++), ориентированные на объекты, а не на посылку сообщений, обладают наряду с этим полиморфизмом, т.е. возможностью использования методов с одинаковыми именами для работы с данными разных типов.
Многие объектно-ориентированные языки имеют средства для объединения объектов в классы. Объекты, принадлежащие одному классу, называются его примерами. Это позволяет хранить процедуры (в терминах объектно-ориентированного программирования - методы), применимые ко всем примерам класса, в единственном экземпляре, только в соответствующем классе. Данный подход имеет очевидные преимущества: код размещается только в одном месте, чем экономится память и обеспечивается модифицируемость программы.
Ряд языков, включая Smalltalk-80, C++, TURBO Pascal и Objective-C, развивают понятие класс за счет то, что классы можно разместить в узлах т.н. дерева наследования. Таким образом строится иерархия классов. При этом пример наследует свойства (методы) своего класса, а также всех суперклассов (надкалассов) этого класса. Методы, определенные в классе-корне дерева, наследуются всеми классами и их примерами.
Наследование наряду с инкапсуляцией и полиморфизмом является важнейшим свойством объектно-ориентированного программирования.
Механизм наследования с древовидной структурой в определенной степени ограничен, так как во многих случаях разделение свойств в соответствии со строгой иерархией не может быть достигнуто. Поэтому некоторые языки допускают классы, которые наследуют свойства более чем одного непосредственного суперкласса, в результате чего иерархия классов становится направленным ациклическим графом, а не деревом. Такой механизм добавлен в качестве расширения в Smalltalk. Подобные механизмы доступны также в основанных на языке LISP объектных системах Flavors, CommonLoops и CLOS.
Объектно-ориентированные языки находят применение, главным образом, при построении моделей, в том числе при создании языков представления знаний и реализации протоколов вычислительных сетей. Потенциальные же возможности объектно-ориентированных языков гораздо шире.
Объект (называемый в этом случае актором), посылающий сообщение, не ждет ответа от своего адресата, а продолжает функционирование. Поэтому сообщения должны быть способны становиться в очередь к адресату. Одновременно может быть активизировано много акторов, причем все вычисления выражаются, главным образом, в терминах их коммуникаций. Языками данного класса являются система Astra, а также Act 1 и Act 3.
Со следующего шага мы начнем рассматривать объектно-ориентированную систему FLAVOR.