Отличие между объектно-ориентированным и объектно-базированным подходами состоит в том, что в объектно-ориентированном подходе вводится концепция наследования для отображения способа человеческого мышления при классификации объектов. Наследование позволяет определить новые типы, (называемые также классами), которые являлись бы расширением уже существующих и формировали бы их иерархию. Наследование представляет собой отношение ``является типом чего-то'' (в отличие от отношения ``является частью чего-то'' или какого-либо другого отношения). Продолжая наш пример, можно создать два новых типа с именами ``мотоцикл'' и ``автобус'', которые являются разновидностями машин. Таким образом, мотоцикл и автобус будут наследниками типа машина. Отметим, что тип с именем ``колесо'' в общем случае не должен наследоваться от типа машина, так как колесо само по себе является не машиной, а ее частью.
Тип наследует все структуры данных и операции, т.е. в нашем примере автобус также будет иметь операцию ехать(пункт_назначения). Еще более важным является то, что, после создания нового типа, можно задать дополнительные операции, относящиеся только к нему или переопределить существующие для выполнения специальных действий над ним. К примеру, для автобуса можно добавить операцию, позволяющую ему взять_пассажиров, и эта новая операция будет применима только к автобусам, но не мотоциклам или другим машинам. Таким же образом можно переопределить операцию ``ехать(пункт_назначения)'' для автобусов, с тем, чтобы ее можно было выполнять каким-либо другим способом.
ООП является применением объектно-ориентированного подхода для разработки программного обеспечения. Грейди Буч (Grady Booch) [1994] дал следующее определение ООП: ``Объектно-ориентированное программирование - это метод реализации, в котором программы организуются в виде взаимодействующих наборов объектов, каждый из которых представляет собой экземпляр класса, а классы являются членами иерархии, связанной отношением наследования''.
Сложно использовать объектно-ориентированный и объектно-базированный подходы, если соответствующий язык программирования не в достаточной степени поддерживает соответствующие возможности. Особенно тяжело использовать объектно-ориентированный подход в языке программирования, напрямую не поддерживающем наследование (и связанную с этим концепцию, называемую полиморфизмом или динамической диспетчеризацией, которая будет рассмотрена далее). С самого начала Ada разрабатывался с явной поддержкой обектно-базированного подхода, а в 1995 году Ada был дополнен с целью поддержки ООП.
Функциональная декомпозиция, определение которой дано выше, - это обычный способ реализации в Fortran и Pascal, хотя опять же, определения не универсальны и не обязательно принимаются всеми. В частности, не следует путать функциональную декомпозицию с процедурными языками программирования, которые поддерживают подход, являющийся существенно отличающимся расширением функциональной декомпозиции. Существуют другие системы декомпозиционных подходов (такие, как логическое программирование), описание которых выходит за рамки данного учебника. Можно также возразить, что абстракция типов данных и объектно-ориентированный подход - не одно и то же; такие доводы в общем основываются на более подробных определениях, которые никогда не были общепринятыми.
Ниже приведены описания двух различных систем. Какое из описаний более ``объектно-ориентировано''?
Система 1 является противоракетной системой с тремя основными типами компонентов: радар, пусковая_установка и ракета. Радар сканирует область неба, определенную переменной область_сканирования. Когда радар находит цель, он отсылает пусковой установке сообщение ``найдена цель''. Когда пусковая_установка получает это сообщение и боевая_часть ``готова'', пусковая_установка выбирает ракету для запуска и посылает ракете команду ``пуск''. Ракета принимает команду ``пуск'', содержащую время запуска и предполагаемое положение цели, а затем стартует в заданное время. Есть два вида ракет: ракеты_большой_дальности и ракеты_малой_дальности.
Система 2 это автомат для продажи бульона. Он принимает монеты, затем обрабатывает выбор бульона, сделанный пользователем и выдает бульон. Для приема монет автомат учитывает достоинство каждой монеты, пока общая сумма не станет равной или превысит стоимость чашки бульона. Для обработки пользовательского выбора бульона система ожидает нажатия соответствующей кнопки. Для приготовления бульона автомат помещает стаканчик в доступный пользователю раздатчик, засыпает выбранный концентрат в стаканчик, затем заливает кипятком и размешивает его. Для перемешивания супа в стаканчик вставляется пластиковая мешалка, производится перемешивание, и мешалка удаляется из чашки.
Какое из описаний более ``объектно-ориентировано''?
Перейти к предыдущему разделу | Перейти к следующему разделу | Вернуться к содержанию Урока 7 |
---|
David A. Wheeler (dwheeler@ida.org)
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s7s1.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк