Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 117
Текст из файла (страница 117)
поллежаший упорялочению, операция сортировки определяется в абстрактном -ипе данных лля массива. Процесс сортировки активизируется путем вызова этой опера.пш для конкретного объекта. представляющего собой массив, Парадигма информацнон-.э-ориентированного программирования была популярной в 1980-х годах и хорошо об:.-.уживалась средствами абстракции данных в языках Мос(ц!а-2, Аоа и некоторыми созэеменными языками. Языки, подлерживаюшие информационно-ориентированное -рограммирование, часто называются объектными (оЬ)ес(-Ьазеб) языками.
11.2.2. Наследование Во второй половине 1980-х годов лля многих разработчиков программного обеспече-ня стало очевидным, что одной из наилучших возможностей для повышения произво:нтельности их труда является повторное использование программ. Вполне очевидно, --о абстрактные типы данных с нх инкапсуляцией и управлением доступом должны ис:ыьзоваться многократно. Проблема, связанная с повгориым использованием абстракт--.л типов данных, почти во всех случаях заключается в том, что свойства н возможно.-л существующих типов не вполне подходят для нового использования.
Старые типы -. обходимо, по крайней мере минимально, модифицировать. Такие модификации могут :гь трудновыполнимыми и требовать от человека понимания части. если ие всего цепком, существующего кода. Кроме того, во многих случаях модификации влекут за со. д изменения во всех программах-клиентах.
Вторая проблема. связанная с программированием, ориентированным на данные, за.дючается в том, что все определенна абстрактных типов данных являются независимын и находятся на одном н том же уровне иерархии. Это часто не позволяет так структу-., ровать программу, чтобы она соответствовала своей проблемной области. Во многих . )чаях исходная задача содержит категории связанных между собой объектов, являюлхся как наследниками одних и тех же прелков (т.е. находящихся на одном и том же "овне иерархии), так и предками и наследниками (т.е.
состоящих в отношении некото-.. й субординации друг с другом). Наследование позволяет решить как проблемы модификации, возникающие в резуль-зте повторного использования абстрактного типа данных, так и проблемы организации -рограмм. Если новый абстрактный тнп данных может наследовать данные и функцио-дзьные свойства некоторого существующего типа. а также модифицировать некоторые з этих сущностей и добавлять новые сущности. то повторное использование значитель-о облегчается без необходимости вносить изменения в повторно используемый абст"зктный тип данных.
Программисты могут брать существующий абстрактный тип дан-ы х и создавать по его образцу новый тип, соответствующий новым требованиям задачи. . редположим, что в программе есть абстрактный тип данных для массивов целых чисел, 453 1 1.2. Объектно-ориентировоииов программирование включающий в себя операцшо сортировки. После некоторого периода использования программа модифицируется и требует наличия не только абстрактного типа данных для массивов целых чисел с операцией сортировки, но н операции вычисления арифметического среднего для элементов объектов, представляющих собой массивы.
Поскольку структура массива скрыта в абстрактном типе данных, без наследования этот тип должен быть модифицирован путем добавления новой операции в эту структуру. При наличии наследования нет необходимости в модификации существующего типа; можно описать подкласс существующего типа, поддерживающий не только операцию сортировки, но и операцию для вычисления среднего арифметического. Абстрактные типы данных в объектно-ориентированных языках по примеру языка Б)М()(.А 67 обычно называются нлассамн (с1аэзез). Как и экземпляры абстрактных типов данных, экземпляры классов называются объектамц (оЬ)есгэ).
Класс, который определяется через наследование от другого класса, называется производным классом (дег1тед с!шз), нли подклассом (зцЬс!азз). Класс, от которого производится новый класс, называется родительским классом (рагепг с!аш), нли суперклассом (шрегс!аш).
Подпрограммы, определяющие операции над объектами класса, называются методами (гпегйобз). Вызовы методов называются сообщениями (шешайез). Весь набор методов объекта называется протоколом сообщений (щешайе ргогосо!), или интерфейсом сообщений (шешабе 1пгег(асе) объекта. сообщение должно иметь, по крайней мере, две части: конкретный объект, которому оно должно быть послано, и имя метода, определяющего необходимое действие над объектом. Таким образом, вычисления в объектноориентированной программе определяются сообщениями, передаваемыми от одного объекта к другому. В простейшем случае класс наследует все сущности (переменные и методы) родительского класса.
Это наследование можно усложнить, введя управление доступом к сущностям родительского класса. Например, в определениях абстрактных типов данных (в главе 10) некоторые сущности классифицируются как открытые, а другие — как закрытые. Это управление доступом позволяет программисту скрыть части абстрактного типа данных от клиентов. Такое управление доступом обычно есть в классах объектноориентированных языков.' Производные классы представляют собой другой вид клиентов, которым доступ может быть либо предоставлен, либо запрещен.
Чтобы это учесть, некоторые объектно-ориентированные языки включают в себя третью категорию управления доступом, часто называемую защищенной (ргогесгеб), которая используется для предоставления доступа производным классам и запрещения доступа другим классам. В дополнение к наследуемым сущностям производный класс может добавлять новые сущности и модифицировать методы. Модифицированный метод имеет то же самое имя и часто тот же самый протокол, что и метод, модификацией которого он является. Говорят, что новый метод замещает (птенчике) наследуемую версию метода, который поэтому называется замещаемым (отепзбеп) методом. Наиболее общее предназначение замещаюшего метода — выполнение операции, специфической для объектов производного класса и не свойственной для объектов родительского класса. Например, рассмотрим иерархию классов, в которой корневой класс описывает общие архитектурные характеристики французских готических соборов.
Этот корневой класс ГгепсЛ бохзс имеет метод для рисования фасада обобщенного французского готического собора. Предположим, что у класса Ггепсл 0осЛзс есть три производных класса — йезжэ, )цязеп и СЛагтгеэ, каждый из которых имеет метод для рисования конкретного фасада. Эти версии метода с)гаи должны замешать метод бган из родительского класса. 434 Глава ! 1.
Поддержка объектно-ориентированного программирования Классы могут иметь два вида методов и два вида переменных. Наиболее широко используемые методы и переменные называются методами и переменными экземпляра ~из!апов те!бог!з апг! таг!аЫез). Каждый объект класса имеет свой собственный набор переменных объекта, описываюших его состояние. Единственное различие между двумя объектами одного и того же класса заключается в состоянии их переменных объекта. Х!етоды объекта оперируют только объектами данного класса. Переменные класса с!аьз таг!ат)ез) принадлежаТ классу, а не объекту, так что они имеют только по одной копии в классе. Методы класса (с)аи шегйобз) могут выполнять операции нал классом л.
возможно, над объектами класса. В этой главе мы будем, в основном, игнорировать методы и переменные класса. Если класс, созданный путем наследования, имеет один родительский класс, то этот -роцесс называется одиночным наследованием (з!пя)е!преп!алое). Если класс имеет .-.есколько родительских классов, то такой процесс называется множественным наслезованием (пш16р!е !ппег!галсе). Если несколько классов связаны между собой одиноч-ыч наследованием, то их взаимоотношения можно изобразить с помощью дерева наследовании (Йеота6оп ггее). Взаимоотношения классов при множественном наследова-ли можно изобразить с помошью графа наследования (бег!табоп ягарЦ. Разработка программы для объектно-ориентированной системы начинается с опреде-гния иерархии классов, описывающей отношения между объектами, которые войдут в -"ограмму, решающую поставленную задачу.
Чем лучше эта иерархия классов соответ.-в) ет проблемной части, тем более естественным будет полное решение. Недостаток наследования как средства, облегчаюшего повторное использование кола, : зьлючается в том, что оно создает зависимость между классами в иерархии наследования. .-о чаляет одно из преимушеств абстрактных типов данных, заключающееся в их взаим-;. независимости, Конечно, не все абстрактные типы данных должны быть полностью неззисимыми, но в обшем случае независимость абстрактных типов данных является олним . их самых сильных положительных свойств. Однако увеличение возможности повторно- использования абстрактных типов данных без создания зависимостей между некоторыиз них может оказаться трудной задачей, если не совсем безнадежной.
11.2.3. Полиморфизм и диисзмическов связмваиив Третьим свойством объектно-ориентированных языков программирования является :- = полиморфизма, обеспечиваемый динамическим связыванием сообщений с определе- зчи методов. Это свойство поддерживается путем разрешения определения полигфных переменных типа родительского класса, которые также могут ссылаться на ьгкты любых подклассов данного класса. Родительский класс может определять ме..:. замешаемый в его подклассах.
Операции, определяемые этими методами, похожи, -: =олжны уточняться для каждого класса в иерархии. Когда такой метод вызывается =ггз полиморфную переменную, этот вызов динамически связывается с метолом в со-згтствуюшем классе. Одна из целей динамического связывания — обеспечить более .=-кое расширение программных систем при их разработке и поддержке. Такие про—.зччы можно писать для операций над объектами настраиваемых классов.