Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 124
Текст из файла (страница 124)
Это происходит потому, что здесь она является локальной, закрытой переменной, и в то же время она должна быть глобальной переменной, когда используется вне определения кл са. С помощью данного класса можно нарисовать последовательность многоугольников с различным количеством сторон, например: МуРо1у ! Муро1у <- Ро1удоп пен. МУРо1у 1еп9<Ь: бО.
3 Го: 8 с[о: [:яжея ! МуРо1у язс[ея: я1с[ея. МУРо1у <[гак] Приведенный код рисует фигуру, указанную на рис. ! !.3. Линии. образующие фигур!. можно сделать толще, изменив форму кончика пера с помощью передачи следующего сообщения внутри определения класса: сзгРеп с[ейаи1гИ1Ь: 4 1 1.6. Примеры программ на языке бша[1!а][с 477 Рис. 11З. Кониенгнрические многоугольники, нарисованные с помощью обьекти Ро1удоп Это изменит форму кончика пера и сделает ее квадратом размером 4 на 4 бита. Результат рисования тех же многоугольников с помощью нового кончика пера показан на рнс. 11.4.
Рис. 11.4. Конпеин~рические гиногоугольники с лараиетраи п1Ь, равны ч 4 а~в Глава 11. Поддержка объектно-ориентироааниого программирования 11.7. Главные особенности языка Зтаитайс 11.7.1. Проверке типов и полиморфизм Динамическое связывание сообщений с методами в языке 5шайта1к выполняется следующим образом. Сообщение, передаваемое объекту, вызывает поиск класса, которому этот объект принадлежит. Если класс не найден, поиск продолжается среди суперклассов чтя данного класса и так далее, вплоть до системного класса ОЬ1есс, который не имеет суперкласса.
Класс ОЬбесс является корнем дерева наследования классов, в котором каждый класс представляет собой узел. Если в этой цепочке метод не обнаружен, возникает ошибка. Важно помнить, что такой поиск метода является динамическим — он происходит, когла передается сообщение.
Язык 5ша!йа!К ни при каких условиях не связывает сообщения с методами статически. Только в языке Бшай[а!К проверка типов является динамической, и ошибки несовместимости типов возникают, только когда сообщение передается объекту, который не имеет соответствующего метода, ни локально, ни через наследование. Эта концепция проверки типов отличается от проверки типов в большинстве других языков. Проверка типов а языке 5тарйарк преследует простую цель — убедиться, что сообщение соответствует методу. Переменные в языке 5шай!а!к не имеют типов; ни одно имя не ограничивается ника"им объектом.
Исходя из этого язык 5шайш!к поддерживает динамический полиморфизм. Все коды в языке Бтайта!К являются настраиваемыми в том смысле, что типы пезеченных не имеют значения до тех пор, пока они являются совместимыми. Смысл опе"зции (метода или оператора) над переменной определяется переменной класса, с 'отарой она в данный момент связана. Предметом данного обсуждения является тот факт, что, если объекты, на которые ;сылается выражение, содержат методы для обработки сообщений этого выражения, титы объектов не имеют значения.
Следовательно, все программы на языке Бшайта1К являются настраиваемыми, и ни одна из них не связана с конкретным типом. 11.У.2. Наследование Подклассы языка 5тайта!к наследуют все переменные экземпляра, методы экземплягз и методы класса своего суперкласса. Подкласс может также иметь свои собственные -еременные экземпляра, которые должны иметь имена, отличающиеся от имен перемен-ых в его классе-предке.
Кроме того, подкласс может определять новые методы и пере.зрелелять методы, уже существующие в классе-предке. Когда подкласс имеет метод, :чя и протокол которого совпадают с именем и протоколом метода в классе-предке, ме-од подкласса маскирует метод класса-предка. Доступ к такому скрытому методу обеспечивается с помощью префиксного сообщения с псевдопеременной вирек. Это привозит к тому, что поиск метода начинается с суперкласса. а не локально. Поскольку сущности в родительском классе не могут быть скрыты от подклассов.
все подклассы являются подтипами. Более того, все наследование является наследованием реализации. Язык Бшайтайс поддерживает только одиночное наследование и не допускает множественного наследования. 1 1.7. Главные особенности языка Бша111а1к 11.8. Оценка языка Зита!1Файс Язык Ьшайга!к — небольшой по размеру язык, хотя система его реализации достаточно велика.
Синтаксис языка прост и систематичен. Язык Ьшайга!к создан на основе простой, но мошной концепции, в соответствии с которой все программирование можно выполнить с помощью только иерархии классов, построенной на основе наследования, объектов и передачи сообщений. По сравнению с обычными компилируемыми программами на императивных языках, эквивалентные программы на языке Бшайгайс выполняются значительно медленнее. Хотя с теоретической точки зрения интересно, что индексирование массивов и циклы можно осуществить с помощью модели передачи сообщений, эффективность все же является важным фактором в оценке языков программирования. Следовательно, эффективность очевидным образом будет предметом большинства дискуссий о практической применимости языка Брай!а!к. Динамическое связывание в языке Бшайга!Е позволяет ошибкам несовместимости типов оставаться незамеченными до времени выполнения программы. Можно написать и откомпилировать программу, которая содержит сообщения, адресуемые несуществующим методам.
Это приведет к большой проблеме, связанной с исправлением большего количества ошибок на поздних этапах разработки программы. чем это может оказаться в языках со статическими типами. Пользовательский интерфейс системы эшайга!к оказал большое влияние на разработку программного обеспечения. Интегрированное использование окон, манипуляторы типа "мышь", выпалаюшие и исчезающие меню доминируют в современных программных системах.
Возможно, наибольшее влияние язык Бтайга!к оказал на развитие объектно-ориентированного программирования, ставшего в настоящее время наиболее распространенной метолологией проектирования и программирования. 11.9. Поддержка объектно-ориентированного арограммирования в языке С++ В главе 2 описано, как язык С++ эволюционировал от языков С и $1МБ!.А 67 в направлении поддержки объектно-ориентированного программирования. Классы в языке С++ с точки зрения их поддержки абстрактных типов ланных обсуждались в главе 10. В данной главе исследуется поддержка языком С++ лругих существенных особенностей объектно-ориентированного программирования. Весь набор подробностей о классах С++, наследовании и динамическом связывании велик и сложен. В этом разделе обсуждаются только самые важные темы. особенно те из них, которые непосредственно связаны с вопросами разработки языков, обсуждаемыми в разделе 11.3.
11.9.1. Общив свойства Поскольку одним из основных требований при создании языка С++ была его полная обратная совместимость с языком С, он сохраняет систему типов языка С и добавляет к ней классы. Следовательно, язык С++ одновременно имеет типы традиционного императивного языка и структуру классов объектно-ориентированного языка. Это делает его 430 Глава 11. Поддержка объектно-ориентированного программирования гибридным языком, поддерживающим как процедурное, так и объектно-ориентированное программирование.
Объекты языка С++ могут быть расположены в памяти там же, где и переменные, размещаемые в языке С. Они могут статически размещаться компилятором, динамически располагаться в стеке или помешаться в динамической памяти с помощью оператора пвн. При использовании оператора це1аце происходит явное удаление объекта из памяти, В языке С++ нет неявного восстановления памяти.
Все классы в языке С++ содержат (как минимум) один метод, называемый конструктором, который используется для инициализации данных — членов нового объекта. Конструкторы вызываются неявно при создании объекта. Если ни один из данных- членов не размещается в динамической памяти, конструктор выполняет такое размеше-ие. Если в определении класса конструктора нет, компилятор добавляет к нему автома-ический конструктор (гг1т!а! сопшпкгог). Этот конструктор, называемый конструктором зэ умолчанию, вызывает конструктор родительского класса, если такой ролительский .ласс существует (см.
раздел 11.9.2). Большинство определений класса содержит метод, называемый деструктором Земгцсгог), который вызывается неявно, когда объект класса перестает существовать. Деструктор используется лля удаления данных-членов из динамической памяти. Он монет также использоваться для создания записи части или всех данных о состоянии объекта непосредственно перед его уничтожением, обычно лля отладки. В то время как язык Ьща1!гайг не позволяет пользователю использовать никакое ° правление доступом к переменным экземпляра и методам в классе, язык С++ предоставляет множество возможностей для такого управления доступом.
Некоторые из них зредназначены для управления тем. что именно клиент может видеть в определении класса, а что — нет. Другие обеспечивают управление доступом для подклассов. Управление доступом к сущностям класса в языке Съ+ обсуждается в разделе 11.9.2. 11.9.2. Нязслвдовязние Класс в языке С++ может быть выведен из существующего класса, который является в таком случае его родительским, или базовым, классом. В отличие от языка Бва(йайц класс в языке С++ может также быть отдельным, не имеющим суперклассов. Напомним, что данные, описанные в определении класса, называются данными- членами этого класса, а функции, описанные в определении класса, называются его функциями-членами.
Некоторые или все данные-члены и функции-члены базового класса могут наследоваться производным классом, который также может добавлять новые данные-члены и функции-члены и модифицировать наследуемые члены. Права доступа, которыми обладают члены подклассов, могут отличаться от прав доступа соответствующих членов базового класса. Это не позволяет рассматривать производные классы в языке С++ в качестве подтипов.