- •Теоретические основы объектно-ориентированного программирования
- •Объектная декомпозиция
- •Диаграмма обслуживания автомашин на бензоколонке
- •Диаграмма объектов имитационной модели бензоколонки
- •Объектная декомпозиция Блока колонок: 1 - когда освободится колонка? 3 - колонка свободна? 2 - освободить колонку 4 - занять колонку
- •Диаграмма объектов графического редактора
- •Диаграмма состояний интерфейса пользователя программы «Записная книжка»
- •Диаграмма объектов предметной области программы «Записная книжка»
- •Обозначение ассоциации: а - с указанием имени ассоциации и ее направления; б - с указанием имен ролей; в - с указанием множественности
- •Контекстная диаграмма классов программы «Записная книжка»
- •Объекты и сообщения
- •Типы отношений между объектами
- •Соответствие объекта-абстракции классу и объектам-переменным
- •Основные средства разработки классов
- •Иерархии классов при различных видах наследования
- •Иерархия классов Окно и Окно_меняющее_цвет
- •Иерархия классов Окно и Окно_с_текстом
- •Иерархия классов при сложном полиморфизме
- •Необходимость позднего связывания
- •Реализация механизма позднего связывания
- •Необходимость явного указания типа объекта, адресуемого указателем родительского класса
- •Вид окна сообщения
- •Структура полей класса Сообщение
- •Дополнительные средства и приемы разработки классов
- •Организация стека вызовов
- •Определение класса
- •Организация списка объектов с использованием статических компонентов класса
- •Конструкторы и деструкторы
- •Наследование
- •Иерархия классов Целое число - Вещественное число
- •Диаграмма классов с наследованием от двух классов и объектным полем
- •Иерархия с многократным наследованием
- •Исключения
- •1. Динамическая проверка типа объекта:
- •2. Динамическое переопределение типа объекта:
- •3. Динамическое определение типа объекта:
-
Организация стека вызовов
Ошибка, обнаруженная в подпрограмме C, может быть обработана в самой подпрограмме C, а может быть передана для обработки подпрограммой B или подпрограммой A, или даже подпрограммами, вызвавшими A. Для этого в одной из этих подпрограмм необходимо предусмотреть обработчик исключительных ситуаций, соответствующий по типу обнаруженной ошибке.
Поиск нужного обработчика осуществляется следующим образом. Вначале проверяется, не описан ли требуемый обработчик в подпрограмме C. Если обработчик отсутствует, то по стеку вызовов определяется подпрограмма, вызвавшая подпрограмму C, и проверяется наличие обработчика в ней. Не обнаружив обработчика в подпрограмме B, система по стеку определит подпрограмму, вызвавшую B, и продолжит поиск обработчика в ней. Обратный просмотр стека будет продолжаться до тех пор, пока не обнаружится обработчик требуемого типа или не выяснится, что такой обработчик в программе не определен. В последнем случае программа завершается аварийно.
Механизм исключений предполагает использование двух конструкций. Первая - обеспечивает описанный выше алгоритм поиска обработчика исключения. Она может быть названа обрабатывающей конструкцией (try...except - в Delphi Pascal, try... catch - в стандарте C++, _try ... _except -в стандарте C). Операторы обработки исключения выполняются только, если при выполнении заданного фрагмента программы обнаруживается исключение указанного типа.
Вторая - используется в тех случаях, когда необходимо обеспечить правильное освобождение ресурсов метода даже при обнаружении исключительных ситуаций. Она называется завершающей конструкцией обработки исключения (try... finally - в Delphi Pascal, try... finally - в стандарте C, try... finally - в стандарте C++Builder). Завершающая обработка исключения отличается от обычной тем, что блок операторов завершающей обработки выполняется в любом случае: как при обнаружении исключения, так и при его отсутствии. Эта конструкция обычно используется для обеспечения освобождения памяти, закрытия файлов и т. д.
В целом при возникновении исключений возможны три варианта действий системы:
• не обнаружен фрагмент, предусматривающий обработку исключений требуемого типа - выполняется аварийное завершение программы с выдачей предусмотренной по умолчанию информации;
• обнаружен фрагмент, включающий обрабатывающую конструкцию - исключение корректируется, и выполнение программы продолжается;
• обнаружен фрагмент, включающий завершающую конструкцию - выполняются операторы завершающей обработки, и программа продолжается с операторов, следующих за блоком завершения.
Исключение может инициироваться:
• операционной системой при получении сигналов от контролирующих схем, например, исключение «деление на ноль»;
• операционной системой при обнаружении некорректных ситуаций в работе программ самой операционной системы;
• библиотечными программами среды разработки;
• непосредственно разрабатываемой программой.
В последнем случае в месте возможного возникновения исключительной ситуации программист организует генерацию исключения (raise - в Delphi Pascal, throw - в C++, вызывает функцию RaiseException - в C). Физически при генерации исключения создается некоторый объект, содержащий информацию об обнаруженной исключительной ситуации. В простейшем случае таким объектом может служить скалярная переменная одного из стандартных типов, а в более сложных - объект описанного ранее класса. В качестве информации может использоваться номер исключения, строка сообщения, значения операндов невыполненной операции, адрес некорректных данных и т. д.
Большое внимание при программировании обработки исключений уделяется работе с типами исключений. Наибольший интерес представляет объявление иерархии классов исключений, что позволяет перехватывать сразу исключения всех типов иерархии обработчиком типа указатель (ссылка) на базовый класс. В процессе обработки таких иерархий исключений обычно используют динамические полиморфные методы, вызов которых происходит в соответствии с реальным типом (классом) исключения, определяемым на этапе выполнения программы.
-
-
СРЕДСТВА ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ В BORLAND C++ 3.1
Объектная модель C++, используемая Borland C++ 3.1, предоставляет программисту несколько большие возможности по сравнению с Borland Pascal 7.0. Так, в языке реализованы более надежные средства ограничения доступа к внутренним компонентам класса, перегрузка операций, возможность создания шаблонов функций и классов.