Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 129
Текст из файла (страница 129)
Это очевидным образом не позволяет подклассу быть подтипом. Для управления доступом клиентов к наследуемым свойствам можно использовать раздел ехрогс. Абстрактные классы определяются добавлением зарезервированного слова гзвйвггва в начале определения класса, как показано ниже: с)вбеггес) с1вав Гддиге Такой класс содержит одно или несколько свойств, которые также являются отложенными (г)еГеггед). Любой подкласс отложенного класса, не являющийся сам по себе отложенным, конечно, должен содержать определения отложенных свойств родительского класса. Язык ЕИГе! поддерживает множественное наследование, которое определяется просто наличием нескольких разделов япЬвгяк. 11.12.3. Динадяическае связывание Все связывания сообщений с методами в языке Е))Те! являются динамическими.
Подпрограммы в подклассах могут замешать наследуемые подпрограммы. Все типы формальных параметров замешаюшей подпрограммы должны быть совместимыми в отношении операции присваивания с параметрами замещаемой подпрограммы. Более того, тип возвращаемого значения замешаюшей подпрограммы должен быть совместим в отношении операции присваивания с типом возвращаемого значения замещаемой подпрограммы. Все замещаемые свойства должны быть определены в разделе гвс)егзпв.
Доступ к замещаемым свойствам можно обеспечить, занеся их имена в раздел гелаев. 496 Глава ) ) . Поддержка объектно-ориентированного программирования 11.12.4. Оценка Способы поддержки объектно-ориентированного программирования в языках Ейте! и !ача похожи. Процедурное программирование в этих языках не поддерживается никогда. И в обоих случаях все связывания сообщений с методами являются динамическими.
Оставив язык )ача в стороне, заметим, что по элегантности и ясности разработки классы н наследование в языке Ейте! уступают только языку Бшайайс 11.13. Реализация объектно-ориентированных конструкций Есть, по крайней мере, два аспекта поддержки языками объектно-ориентированного программирования, которые ставят перед разработчиками языков интересные вопросы, — структуры памяти для хранения переменных экземпляра и динамическое связывание сообщений с методами. В этом разделе мы кратко рассмотрим обе проблемы.
11.13.1. Хранение денных экземпляра В языке С++ классы определяются как расширения структур (гесоп! зппсгцгез). В действительности, структура, которая в языке С++ обозначается зарезервированным словом ескцас, может содержать функции. Единственное различие между структурой в языке С++ и классом заключается в том, что все члены структуры по умолчанию являются открытыми, в то время как все члены класса по умолчанию являются закрытыми. Эта схожесть очевидно подразумевает, что экземпляры классов хранятся в памяти аналогично структурам. Мы будем называть такой вид структуры памяти для хранения экземпляров записью экземпляра класса (С!й — с!аи !пыапсе гесогг!). Структура С!К является статической, поэтому она создается во время компиляции и используется в качестве шаблона при создании экземпляров класса.
Подклассы могут просто расширять структуру С! К родительского кяасса, добавляя новые переменные экземпляра. Поскольку структура СИ является статической, доступ ко всем переменным экземпляра осуществляется так же, как и к полям записей, с помощью постоянных по величине смещений от начала записи экземпляра класса. В результате, такой доступ так же эффективен, как и доступ к полям записей.
Запись экземпляра класса, который имеет родительский класс, просто добавляет его новые данные к записям экземпляра родительского класса. Этот подход к реализации хранения данных экземпляра должен работать во всех объектно-ориентированных языках, обсуждаемых в этой главе. 11 13.2. Аинамическое связывание сообщений с методами Статически связанные методы в классе не нужно включать в структуру С!К ланного класса. Однако, чтобы динамически связанные методы входили в эту структуру, следует включить в нее указатели на коды этих методов, которые устанавливаются во время создания объекта.
Вызовы метода мо~ут быть затем связаны с соответствующим кодом с помощью его указателя в структуре экземпляра. Недостаток этого приема заключается в том, что каждый экземпляр должен был бы хранить указатели на все динамически связанные методы, которые могли быть вызваны из этого экземпляра. 497 11.13. Реализация объектно-ориентированных конструкций Заметим, что список динамически связанных методов, которые могут быть вызваны из экземпляра класса, одинаков лля всех экземпляров данного класса.
Следовательно, список таких методов нужно хранить только в одном месте. Таким образом, в структуре С1К нужно хранить только один указатель на этот список, чтобы иметь возможность найти вызываемые методы. Структура для хранения этого списка иногда называется таблицей виртуальных методов (ЧМТ вЂ” чнтца! щет(код гаЫе). Вызовы методов можно представить в виде смещений в таблице ЧМТ. Полиморфные переменные родительского класса всегла ссылаются на структуру С1К объекта соответствующего типа, так что получение нужной версии динамически связанного метода гарантируется. Рассмотрим следующий пример, в котором все методы предполагаются динамически связанными: с1авв Яса11 ( риЫ1с 1пФ.
а, )э, с; рцЫ1с чодс1 с)гаи() ( с1аве Ьагсе елсепс(в Якпа11 ( рцЫлс дпс с), е; рцЫхс чолс с(гаьг() ( рц)э11с чозс1 з11С() ( Структуры С1К классов Ягпа11 и Ьагсе вместе с их таблицами ЧМТ показаны на рис.11.5. Запись акзаитнпк класса зла) ) ТВМ кпасск зяащ Запись зккемппкРа ГЛКССа Ьагсв ТВМ снсек1 агсе Рнс 11.5. Залиси экземляров ккассов н табтины виртуальиых методов Объектно-ориентированное программирование включает в себя три основных понятия: абстрактные типы данных, наследование и динамическое связывание. Объектноориентированные языки придерживаются этой парадигмы с помощью классов, методов, объектов и передачи сообщений. Обсуждение объектно-ориентированных языков программирования в этой главе вращается вокруг семи вопросов разработки языков: исключительность обьектов, подклассы и подтипы. реализация и интерфейс наследования, проверка типов и полиморфизм, юв Глава 11.
Поддержка объектно-ориентированного программирования одиночное н множественное наследование, динамическое связывание. явное и неявное удаление объектов из памяти. Язык Ьщайга!и — чисто объектно-ориентированный язык. Все сущности в нем являются объектами и все вычисления выполняются через передачу сообщений. Методы конструируются из выражений.
Выражение описывает объелт, представляющий собой значение выражения. Управляющие структуры в языке Бтайга!к, как и во всех других языках, конструируются с использованием объектов и сообщений. Несмотря на то что они выглядят как обычно, их семантика значительно отличается от соответствующих структур в императивных языках. В языке бшайга1к все подклассы являются подтипами. Все проверки типов и связывание сообщений с методами выполняются динамически, и любое наследование является одиночным. Язык Ьщайза!к не имеет явного оператора удаления объектов из памяти, Язык С++ обеспечивает поддержку абстракции данных, наследование и возможное динамическое связывание сообщений с объектами наряду со всеми обычными свойствами языка С. Это означает, что он имеет две различные системы типов.
Несмотря на то что динамическое связывание в языке Бтайга!к обеспечивает несколько большую гибкость программирования, чем гибридные языки, например С++. он намного менее эффективен. Язык С++ обеспечивает множественное наследование и явное удаление объектов из памяти. Язык С++ имеет разнообразные средства управления доступом к сущностям в классе, некоторые из которых не позволяют подклассам быть подтипами. Класс может содержать вызываемые неявно методы конструктора и деструктора, Язык )ача, в отличие от гибридного языка С++, является полностью объектноориентированным. Все объекты размещаются в динамической памяти и доступны через ссылки на них.
В языке нет явной операции удаления объектов из памяти. Методами являются только подпрограммы, и вызвать их можно только через объекты или классы. Непосредственно поддерживается только одиночное наследование, хотя возможна также и некоторая разновидность множественного наследования с помощью интерфейсов. Все связывания сообщений с методами — динамические, за исключением методов, которые не могут быть замещаемыми. Кроме классов, в качестве второй конструкции инкапсуляции язык )ача солержит пакеты.
Язык Ада 95 обеспечивает поддержку объектно-ориентированного программирования с помощью меченых типов, которые могут использовать наследование. Возможно динамическое связывание с использованием ассоциированных типов. Производные типы являются расширениями родительских типов, если они не определены в библиотеке дочерних пакетов. В этом случае сущности родительского типа могут быть исключены из производного типа. Вне библиотеки дочерних пакетов все подклассы являются подтнпами. Язык Е1!Те! — это новый объектно-ориентированный язык, не основанный ни на одном из существующих языков.