- •Введение
- •Как использовать руководства по Borland Pascal
- •Глава 1. Установка и запуск Borland Pascal
- •Использование программы Install
- •Программа Install и Windows
- •Запуск Borland Pascal
- •Защищенный режим и память
- •Запуск Borland Pascal for Windows
- •Запуск bp.Exe в расширенном режиме Windows 386
- •Запуск bp.Exe в стандартном режиме Windows
- •Запуск bp.Exe в окне Windows dos
- •Жидкокристаллические и плазменные экраны
- •Файл readme
- •Файлы filelist.Doc и helpme!.Doc
- •Примеры программ
- •Глава 2. Что нового в Borland Pascal
- •Три интегрированных интерактивных среды разработки программ
- •Новые средства ide
- •Компилятор командной строки, работающий в защищенном режиме
- •Среда разработки программ защищенного режима dos
- •Динамически компонуемые библиотеки dos
- •Добавления к языку Паскаль
- •Улучшения в библиотеке исполняющей системы
- •Новые подпрограммы модуля System
- •Новые модули
- •Новые директивы компилятора
- •Усовершенствования компилятора
- •Улучшения в Turbo Vision
- •Улучшения ObjectWindows
- •Новые средства и утилиты
- •Глава 3. Основы интегрированной среды для dos
- •Запуск ide
- •Компоненты интегрированной среды
- •Окна ide
- •Управление окном
- •Строка состояния
- •Диалоговые окна
- •Глава 4. Программирование в интегрированной интерактивной среде для dos
- •Запуск ide и выход из нее
- •Параметры запуска
- •Установка параметров запуска в интегрированной среде
- •Выход из ide
- •Использование справочной системы Help
- •Перемещение в справочной системе
- •Запрос помощи
- •Копирование примеров исходного кода
- •Загрузка других справочных файлов
- •Выход из справочника Help
- •Запись и редактирование исходного кода
- •Настройка конфигурации редактора
- •Изменение решения: команда Undo
- •Групповая отмена
- •Отмена отмены
- •Работа с блоками текста
- •Выделение блока
- •Вырезание, копирование и вставка блоков
- •Изменение поведения выделенных блоков
- •Поиск и замена
- •Соответствие пар ограничителей
- •Переход к строке с заданным номером
- •Использование локального меню окна редактирования
- •Выделение синтаксиса
- •Выбор файлов для выделения
- •Запрещение выделения синтаксиса
- •Глава 4. Программирование в интегрированной интерактивной среде для dos (часть2) Печать исходного кода
- •Работа с файлами
- •Открытие файлов
- •Открытие файла в позиции курсора
- •Компиляция и выполнение
- •Выбор целевой платформы
- •Компиляция
- •Формирование (Make)
- •Построение (Build)
- •Выполнение
- •Передача программе параметров
- •Параметры компилятора и компоновщика
- •Оптимизация кода
- •Условная компиляция
- •Директивы define и undef
- •Предопределенные идентификаторы
- •Идентификаторы iFxxx, else и endif
- •Директивы ifdef и ifndef
- •Директива ifopt
- •Просмотр исходного кода
- •Просмотр объектов
- •Просмотр модулей
- •Просмотр глобальных идентификаторов
- •Просмотр идентификаторов в исходном коде
- •Просмотр функций ObjectBrowser
- •Выполнение в ide других программ
- •Настройка меню Tools
- •Работа с окном Messages
- •Настройка конфигурации ide
- •Сохранение рабочей операционной среды
- •Использование файла конфигурации
- •Использование файла оперативной области
- •Управление проектом
- •Глава 5. Программирование в интегрированной интерактивной среде для Windows
- •Запуск ide для Windows
- •Использование оперативной полосы
- •Настройка конфигурации оперативной полосы
- •Использование справочной системы Help
- •Перемещение по справочной системе
- •Запрос помощи
- •Копирование примеров кода
- •Выход из справочной системы
- •Запись и редактирование исходного кода
- •Настройка конфигурации редактора
- •Набор команд
- •Использование редактора
- •Выделение синтаксиса
- •Цветовое выделение текста
- •Использование системных цветов Windows
- •Изменение атрибутов текста
- •Печать исходного кода
- •Работа с файлами
- •Открытие файлов
- •Где находятся файлы?
- •Работа с файлами в другом каталоге
- •Компиляция и выполнение
- •Просмотр исходного кода
- •Просмотр объектов
- •Буквенные символы в ObjectBrowser
- •Фильтры
- •Просмотр глобальных идентификаторов
- •Просмотр идентификаторов в исходном коде
- •Выполнение в ide других программ
- •Настройка конфигурации ide
- •Глава 6. Отладка в интегрированной среде
- •Что такое отладка?
- •Какие существуют виды ошибок?
- •Методы отладки
- •Генерация отладочной информации
- •Управление выполнением
- •Что такое шаг?
- •Выполнение программы по шагам
- •Трассировка программы
- •Трассировка или выполнение по шагам?
- •Выполнение больших фрагментов
- •Поиск нужного места
- •Повторное выполнение
- •Отслеживание вывода программы
- •Переключение экранов
- •Окно Output
- •Использование двух мониторов
- •Просмотр значений
- •Что такое выражение?
- •Просмотр выражений
- •Спецификаторы формата в выражениях отладчика
- •Вычисление и модификация
- •Использование точек останова
- •Задание точек останова
- •Отмена точке останова
- •Модификация точек останова
- •Создание условный точек останова
- •Прерывание программы без точек останова
- •Глава 7. Модули Borland Pascal
- •Что такое модуль?
- •Структура модуля
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Как используются модули?
- •Ссылки на описания модуля
- •Оператор uses секции реализации
- •Стандартные модули
- •Создание ваших собственных модулей
- •Компиляция модуля
- •Доступность модуля для программы
- •Модули и большие программы
- •Утилита tpumover
- •Глава 7. Модули Borland Pascal
- •Что такое модуль?
- •Структура модуля
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Как используются модули?
- •Ссылки на описания модуля
- •Оператор uses секции реализации
- •Стандартные модули
- •Создание ваших собственных модулей
- •Компиляция модуля
- •Доступность модуля для программы
- •Модули и большие программы
- •Утилита tpumover
- •Глава 9. Объектно-ориентированное программирование
- •Объекты
- •Наследование
- •Объекты: наследующие записи
- •Экземпляры объектных типов
- •Поля объектов
- •Хорошая и плохая техника программирования
- •Совмещенные код и данные
- •Определение методов
- •Область действия метода и параметр Self
- •Поля данных объекта и формальные параметры метода
- •Объекты, экспортируемые модулями
- •Секция private
- •Программирование в "действительном залоге"
- •Глава 9. Объектно-ориентированное программирование(часть2) Инкапсуляция
- •Методы: никакого ухудшения
- •Расширяющиеся объекты
- •Наследование статических методов
- •Виртуальные методы и полиморфизм
- •Раннее связывание против позднего связывания
- •Совместимость типов объектов
- •Полиморфические объекты
- •Виртуальные методы
- •Проверка диапазонов при вызове виртуальных методов
- •Расширяемость объекта
- •Статические методы или виртуальные методы?
- •Динамические объекты
- •Размещение и инициализация с помощью процедуры New
- •Удаление динамических объектов
- •Деструкторы
- •Пример размещения динамического объекта
- •Что же дальше?
- •Заключение
- •Глава 10. Взгляд на Windows
- •Что такое приложение Windows?
- •Преимущества Windows
- •Требования
- •Программные средства
- •Архитектура с управлением по событиям
- •Графика, независимая от устройств
- •Многозадачность
- •Управление памятью
- •Ресурсы
- •Динамическая компоновка
- •Буфер вырезанного изображения
- •Динамический обмен данными
- •Множественный документальный интерфейс
- •Типы данных Windows
- •Объектно-ориентированная работа с окнами
- •Лучший интерфейс с Windows
- •Интерфейсные объекты
- •Абстрагирование функций Windows
- •Автоматизация ответа на сообщения
- •Структура программы Windows
- •Структура Windows
- •Взаимодействие с Windows и dos
- •Элементарная программа
- •Действия программы при запуске
- •Назначение основного окна
- •Цикл разработки прикладной программы
- •Изучение ObjectWindows
Раннее связывание против позднего связывания
Различие между вызовом статического метода и динамического
метода является различием между решением сделать немедленно и ре-
шением отложить. Когда вы кодируете вызов статического метода, вы
по существу говорите компилятору; "Ты знаешь, чего я хочу. Пойди
и вызови это." С другой стороны, применение вызова виртуального
метода, подобно разговору с компилятором; "Ты не знаешь пока, че-
го я хочу. Когда придет время, задай вопрос о конкретном экземп-
ляре."
Подумайте об этой метафоре в терминах проблемы MoveTo, упо-
мянутой в предыдущем разделе. Вызов TBee.MoveTo может привести
только к одному - выполнению MoveTo, ближайшей в объектной иерар-
хии. В этом случае TBee.MoveTo по-прежнему будет вызывать опреде-
ление MoveTo для TWinged, так как TWinged является ближайшим к
TBee типом вверх по иерархии. Если предположить, что не определен
никакой дочерний тип, который определяет собственный метод
MoveTo, переопределяющий MoveTo типа TWinged, то любой порожден-
ный по отношению к TWinged тип будет по-прежнему вызывать тот же
самый экземпляр метода MoveTo. Решение может быть принято во вре-
мя компиляции и это все, что должно быть сделано.
Однако совсем другое дело, когда метод MoveTo вызывает Show.
Каждый тип фигуры имеет свой собственный экземпляр Show, поэтому
то, какой экземпляр Show вызывается методом MoveTo, полностью за-
висит от того, какая реализация объекта вызывает MoveTo. Именно
поэтому решение о вызове метода Show внутри экземпляра MoveTo
должно быть отложено: при компиляции кода MoveTo не может принято
никакого решения относительно того, какой метод Show должен быть
вызван. Эта информация недоступна во время компиляции, поэтому
решение должно быть отложено до тех пор, пока программа не начнет
выполняться, и пока нельзя будет запросить экземпляр объекта, вы-
зывающий MoveTo.
Процесс, с помощью которого вызовы статических методов од-
нозначно разрешаются компилятором во время компиляции в один ме-
тод, называется ранним связыванием. При раннем связывании вызыва-
ющий и вызываемый методы связываются при первой же возможности,
т.е. во время компиляции. При позднем связывании вызывающий и вы-
зываемый методы не могут быть связаны во время компиляции, поэто-
му включается механизм, позволяющий осуществить связывание нес-
колько позднее, когда вызов действительно произойдет.
Сущность механизма интересна и тонка, и немного позднее вы
увидите, как он работает.
Совместимость типов объектов
Наследование до некоторой степени изменяет правила совмести-
мости типов в Borland Pascal. Помимо всего прочего, порожденный
тип наследует совместимость типов всех своих порождающих типов.
Эта расширенная совместимость типов принимает три формы:
- между реализациями объектов;
- между указателями на реализации объектов;
- между формальными и фактическими параметрами.
Однако очень важно помнить, что во всех трех формах совмес-
тимость типов расширяется только от потомка к родителю. Другими
словами, дочерние типы могут свободно использоваться вместо роди-
тельских, но не наоборот.
В модуле WORKERS.TPU TSalaried является потомком TEmployee,
а TCommissioned - потомком TSalaried. Помня об этом, рассмотрим
следующие описания:
tyрe
PEmрloyee = ^TEmployee;
PSalaried = ^TSalfried;
PCommissioned = ^TCommissioned;
var
AnEmрloyee: TEmployee;
ASalaried: TSalaried;
PCommissioned: TCommissioned;
TEmployeePtr: PEmрloyee;
TSalariedPtr: PSalaried;
TCommissionedPtr: PCommissioned;
При данных описаниях справедливы следующие операторы присва-
ивания:
AnEmрloyee :=ASalaried;
ASalaried := ACommissioned;
TCommissionedPtr := ACommissioned;
Примечание: Порождающему объекту можно присвоить эк-
земпляр любого из его порожденных типов.
Обратные присваивания недопустимы.
Эта концепция является новой для Паскаля, и в начале, воз-
можно, вам будет трудновато запомнить, в каком порядке следует
совместимость типов. Думайте следующим образом: источник должен
быть в состоянии полностью заполнить приемник. Порожденные типы
содержат все, что содержат их порождающие типы благодаря свойству
наследования. Поэтому порожденный тип имеет либо в точности такой
же размер, либо (что чаще всего и бывает) он больше своего роди-
теля, но никогда не бывает меньше. Присвоение порождающего (роди-
тельского) объекта порожденному (дочернему) могло бы оставить не-
которые поля порожденного объекта неопределенными, что опасно и
поэтому недопустимо.
В операторах присваивания из источника в приемник будут ко-
пироваться только поля, являющиеся общими для обоих типов. В опе-
раторе присваивания:
AnEmрloyee := ACommissioned;
Только поля Name, Title и Rate из ACommissioned будут скопи-
рованы в AnEmрloyee, т.к. только эти поля являются общими для
TCommissioned и TEmployee. Совместимость типов работает также
между указателями на типы объектов и подчиняется тем же общим
правилам, что и для реализаций объектов. Указатель на потомка мо-
жет быть присвоен указателю на родителя. Если дать предыдущие оп-
ределения, то следующие присваивания указателей будут допустимы-
ми:
TSalariedPtr := TCommissionedPtr;
TEmployeePtr := TSalariedPtr;
TEmployeePtr := PCommissionedPtr;
Помните, что обратные присваивания недопустимы.
Формальный параметр (либо значение, либо параметр-перемен-
ная) данного объектного типа может принимать в качестве фактичес-
кого параметра объект своего же типа или объекты всех дочерних
типов. Если определить заголовок процедуры следующим образом:
рrocedure CalcFedTax(Victim: TSalaried);
то допустимыми типами фактических параметров могут быть TSalaried
или TCommissioned, но не тип TEmployee. Victim также может быть
параметром-переменной. При этом выполняются те же правила совмес-
тимости.
Замечание: Имейте в виду, что между параметрами-значениями и
параметрами-переменными есть коренное отличие. Параметр-значение
является указателем на действительный, посылаемый в качестве па-
раметра объект, тогда как параметр-переменная является только ко-
пией фактического параметра. Более того, эта копия включает толь-
ко те поля, которые входят в тип формального параметра-значения.
Это означает, что фактический параметр буквально преобразуется к
типу формального параметра. Параметр-переменная больше напоминает
приведение к образцу, в том смысле, что фактический параметр ос-
тается неизменным.
Аналогично, если формальный параметр является указателем на
тип объекта, фактический параметр может быть указателем на этот
тип объекта или на любой дочерний тип. Пусть дан заголовок проце-
дуры:
рrocedure Worker.Add (AWorker: PSalaried);
тогда допустимыми типами фактических параметров могут быть
PSalaried или PCommissioned, но не тип PEmрloyee.