Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Лекция 8

Лекция 7

3.2. Структура фрейма процедуры. Связь фреймов в динамическую цепочку (цепочку вызовов) и статическую цепочку (контекст)   Процедура представляет собой программу в миниатюре, являясь частью основной программы или другой процедуры. Синтаксис процедуры полностью повторяет синтаксис программы. Отличие состоит только в заголовках. Процедуры могут быть простыми и маленькими (всего с десяток операторов), а могут быть очень сложными и большими (несколько сотен операторов). Процедуры могут содержать свои собственные процедуры и функции. Поэтому на процедуры, как и на программы, распространяется методология проектирования программных систем. Эта методология предусматривает разработку спецификации на каждую программную единицу, в том числе и на процедуру. Спецификация — это точное, однозначное, недвусмысленное описание, написанное постановщиком задачи для программиста. Спецификация включает в себя концептуальное описание программной единицы, описание потоков данных, подробный алгоритм, и, возможно, другие разделы, которые зависят от выбранного метода проектирования.   3.3. Хранение и преобразование контекстов при процедурных переходах. Представление процедуры как хранимого объекта. Запоминание контекста

Лекция 8

4.1. Поля и методы объектов. Наследование   Массивы объединяют однородные единицы информации, т.е. элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, указывая положение точки в пространстве, мы можем воспользоваться одним и тем же типом для указания ее координат, но, описывая человека, мы должны указать его имя, рост, цвет глаз и волос, то есть в одном описании объединить разнородную информацию. Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, часто разнотипных, элементов, называют записью (record). Запись в Паскале — это структурированный комбинированный тип данных, состоящий из фиксированного числа компонент (полей) разного типа.   Управлять большим количеством разрозненных объектов сложно. С этим можно справиться путем упорядочивания и ранжирования объектов, то есть объединяя общие для нескольких объектов свойства в одном объекте и используя этот объект в качестве базового.   Эту возможность предоставляет механизм наследования. Он позволяет строить иерархии, в которых объекты-потомки получают свойства объектов-предков и могут дополнять их или изменять. Таким образом, наследование обеспечивает возможность повторного использования кода.   При описании объекта имя его предка записывается в круглых скобках после ключевого слова object.   Унаследованные поля доступны в объекте точно так же, как и его собственные. Изменить или удалить поле при наследовании нельзя. Таким образом, потомок всегда содержит количество полей, большее или равное количеству полей своего предка.   В потомке объекта можно не только описывать новые методы, но и переопределять существующие. Метод можно переопределить либо полностью, либо дополнив метод предка.   Паскаль — язык со строгой типизацией. Операнды выражений, параметры подпрограмм и их аргументы должны подчиняться правилам соответствия типов. Для объектов понятие совместимости расширено: производный тип совместим со своим родительским типом. Эта расширенная совместимость типов имеет три формы:
  • между экземплярами объектов;
  • между указателями на экземпляры объектов;
  • между параметрами и аргументами подпрограмм.
Во всех трех случаях родительскому объекту может быть присвоен экземпляр любого из его потомков, но не наоборот.   Поля и методы, введенные в потомке, после таких присваиваний недоступны. Даже если метод переопределен в потомке, через указатель на предка вызывается метод, описанный в предке.   Если известно, что указатель на предка на самом деле хранит ссылку на потомка, можно обратиться к элементам, определенным в потомке, с помощью явного преобразования типа.   Если объект является параметром подпрограммы, ему может соответствовать аргумент того же типа или типа любого из его потомков, но есть разница между передачей объектов по значению и по адресу.   Параметр, передаваемый по значению, представляет собой копию объекта-аргумента и содержит только поля данных и методы, имеющиеся в объекте-параметре (то есть при передаче по значению тип аргумента приводится к типу параметра).   При передаче объекта по адресу подпрограмме передается указатель на фактический объект (приведение типов не выполняется).   Если параметр подпрограммы является указателем на объект, передаваемым по значению, то аргумент может быть указателем на этот же объект или на любого из его потомков.   Объекты, фактический тип которых может изменяться во время выполнения программы, называются полиморфными. Полиморфным может быть объект, определенный через указатель или переданный в подпрограмму по адресу. Полиморфные объекты обычно применяются вместе с виртуальными методами.     4.2. Таблица виртуальных методов. Динамические свойства объектов   Рассмотрим работу компилятора при использовании в программе иерархий объектов. Исполняемые операторы программы в виде инструкций процессора находятся в сегменте кода. Каждая подпрограмма имеет точку входа. При компиляции вызов подпрограммы заменяется последовательностью команд, которая передает управление в эту точку. Этот процесс называется разрешением ссылок, или ранним связыванием, потому что адреса перехода на подпрограммы компилятор вставляет до выполнения программы. Ясно, что с помощью этого механизма не удастся обеспечить возможность вызова методов разных объектов (предков и потомков) с помощью одного и того же указателя или из одной и той же подпрограммы. Это можно сделать только в том случае, если ссылки будут разрешаться на этапе выполнения программы в момент вызова метода. Такой механизм называется поздним связыванием и реализуется с помощью виртуальных методов. Они определяются с помощью директивы virtual, которая записывается в заголовке метода.   Объявление метода виртуальным означает, что все ссылки на этот метод будут разрешаться по факту его вызова, то есть не на стадии компиляции, а во время выполнения программы. Для реализации этой возможности необходимо, чтобы адреса виртуальных методов хранились там, где ими можно в любой момент воспользоваться, поэтому компилятор формирует для них таблицу виртуальных методов (VMT — virtual method table). Для каждого объектного типа создается одна VMT.   Каждый объект во время выполнения программы должен иметь доступ к VMT. Эта связь устанавливается при создании объекта с помощью специального метода, называемого конструктором (constructor). Класс, имеющий хотя бы один виртуальный метод, должен содержать конструктор.   По ключевому слову constructor компилятор вставляет в начало метода фрагмент, который записывает ссылку на VMT в специальное поле объекта. Прежде чем использовать виртуальные методы, необходимо вызвать конструктор объекта.   Конструктор обычно используется для инициализации объекта. В нем выполняется выделение памяти под динамические переменные или структуры, если они есть в объекте, и присваиваются начальные значения полям объекта. Поскольку связь с VMT устанавливается в самом начале конструктора, в его теле также можно пользоваться виртуальными методами.   Объект может содержать несколько конструкторов. Конструктор надо вызывать явным образом для каждого создаваемого объекта.   Вызов виртуального метода выполняется так: из объекта берется адрес его VMT, из VMT выбирается адрес метода, а затем управление передается этому методу. Таким образом, при использовании виртуальных методов из всех одноименных методов иерархии всегда выбирается тот, который соответствует фактическому типу вызвавшего его объекта.   Правила описания виртуальных методов:
  1. Если в объекте метод определен как виртуальный, во всех потомках он также должен быть виртуальным.
  2. Заголовки всех одноименных виртуальных методов должны совпадать.
  3. Переопределять виртуальный метод в каждом из потомков не обязательно: если он выполняет устраивающие потомка действия, он будет унаследован.
  4. Объект, имеющий хотя бы один виртуальный метод, должен содержать конструктор.
Виртуальные методы незаменимы и при передаче объектов в подпрограммы. В заголовке подпрограммы описывается либо объект базового типа, передаваемый по адресу, либо указатель на этот объект, а при вызове в нее передается объект или указатель производного класса. В этом случае виртуальные методы, вызываемые для объекта из подпрограммы, будут соответствовать типу аргумента, а не параметра.   При описании объектов рекомендуется определять как виртуальные те методы, которые в его потомках будут реализовываться по-другому.   Для хранения объектов в программах чаще всего используется динамическая память, поскольку это более эффективно. Благодаря расширенной совместимости типов можно описать указатель на базовый класс и хранить в нем ссылку на любой его объект-потомок, что в сочетании с виртуальными методами позволяет единообразно работать с различными классами иерархии. Из объектов и указателей на них создают различные динамические структуры.   Для выделения памяти под объекты используются процедура и функция New. Так как после выделения памяти объект обычно инициализируют, для удобства определены расширенные формы New со вторым параметром — конструктором объекта.   С объектами в динамической памяти часто работают через указатели на базовый класс, то есть описывают указатель базового класса, а инициализируют его, создав объект производного класса. Такие объекты называют полиморфными. Они используются для того, чтобы можно было работать с объектами разных классов единообразно.   Для освобождения памяти, занятой объектом, применяется процедура Dispose. Она освобождает количество байтов, равное размеру объекта, соответствующего типу указателя. Если в указателе хранится ссылка на объект производного класса, будет освобождено неверное количество байтов. Для корректного освобождения памяти из-под полиморфных объектов следует использовать вторым параметром Dispose специальный метод — деструктор.   В деструкторе можно описывать любые действия, необходимые для конкретного объекта, например закрытие файлов. Деструктор может быть пустым. Для объектов, содержащих динамические поля, в нем записываются операторы освобождения памяти для этих полей.   Компилятор по служебному слову destructor вставляет в конец тела метода операторы получения размера объекта из VMT. Деструктор передает этот размер процедуре Dispose, и она освобождает количество памяти, соответствующее фактическому типу объекта. Деструкторы обязательно использовать только для динамических полиморфных объектов. В объекте можно определить несколько деструкторов (в этом случае они должны иметь разные имена).

 


<== предыдущая | следующая ==>
Характеристика процессуальных теорий мотивации труда | Подготовка и проведение фокус-групп

Date: 2015-08-15; view: 513; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию