Пятница, 21.09.2018, 05:23
Главная Регистрация RSS
Приветствую Вас, Гость
Меню сайта
Ссылки
Статистика
Реклама
01
 
Реклама
Поиск
Друзья сайта
Работа, база вакансий и резюме  Белый каталог сайтов - RabOnline.ru/dir Результаты антивирусного сканирования
Реклама
01

Страница: 1 2 3 4 5 6 7

Суть инкапсуляции и структуру описания класса в Object Pascal. Объясните понятие объекта.

Классом называется описание некоторой структуры программы, обладающей набором внутренних переменных — свойств, и функций (процедур), имеющих доступ к свойствам — методов. Процесс объединения переменных и методов, в результате которого и получается класс, называется инкапсуляцией. Описание классов разделено на две части — интерфейсную («заголовочную») и описательную. В интерфейсной части располагается описание заголовка класса, в котором указывается название класса, по которому будут создаваться его экземпляры, описания свойств и заголовков методов. В описательной части располагается реализация методов, заголовки которых указаны в интерфейсной части описания класса. Интерфейсная часть описания класса располагается в разделах описания нестандартных типов данных модулей и основных частей программ. Для доступа к свойствам и методам класса (за исключением статических методов) необходимо создать переменную-экземпляр класса — объект.

Области видимости элементов классов, применяемые в Object Pascal.

Для разграничения доступа к свойствам и методам объектов классов между различными частями программы предусмотрены модификаторы доступа («видимости»). Модификатор доступа относится не к конкретному свойству или методу класса, а ко всем элементам класса, описание которых располагается после указания модификатора. Один и тот же модификатор может указываться в описании класса более одного раза.

В Object Pascal применяется четыре области видимости:

  • закрытая для всех фрагментов программ, не находящихся в одном модуле с описываемым классом. Такая область видимости начинается ключевым словом private;
  • видимая только классам, наследуемым отданного, или расположенным в одном модуле с описанием данного класса. Такая область видимости начинается ключевым словом protected;
  • доступная любым фрагментам программы. Такая область видимости начинается ключевым словом public;
  • доступная любым фрагментам программы, а также выдающая информацию о своих описаниях во время выполнения программы. Описания, расположенные в такой области видимости, доступны для изменения в режиме визуальной разработки программы. Область начинается ключевым СЛОВОМ published.

Правила описания методов в классах и их особенностях.

Описательная часть класса находится в разделе описания локальных подпрограмм. Методы, заявленные в интерфейсной части реализуются по обычным правилам описания процедур и функций. Для связи функций с классом, методами которого они являются, название класса указывается перед именем самой функции:

Procedure <Имя класса>.<Имя метода>(<Список параметров>);<Список модификаторов>;

Или для методов-функций:

Function <Имя класса>.<Имя метода>(<Список параметров>):<Тип значения>;<Список модификаторов>;

Отличием методов от обычных процедур и функций является то, что они могут обращаться к свойствам классов по имени без указания объектов. На этапе выполнения программы такие обращения будут перенаправлены к свойствам объектов, из которых вызываются соответствующие методы. Вызов метода из экземпляра класса предваряется названием переменной, указывающей на необходимый экземпляр:

<Имя объекта>.<Имя метода>(<Список параметров>);

Понятия статических, перегружаемых и абстрактных методов. 

В Object Pascal реализованы методы класса (статические методы), особенность которых состоит в том, что для их вызова нет необходимости создавать объект (экземпляр класса). Статические методы можно использовать как обычные подпрограммы. Однако такие методы доступны и из экземпляров класса. Для описания статических методов используется ключевое слово class перед заголовком метода. Для вызова метода класса необходимо указать название класса и название метода со списком необходимых параметров.

Допускается использование перегружаемых методов, то есть методов с идентичными именами, но разной сигнатурой. Их описание и использование аналогично работе с перегружаемыми подпрограммами. Для того чтобы не описывать «пустые» методы, в Delphi предусмотрен специальный модификатор методов abstract. Описание метода, помеченного ключевым словом abstract, в классе, где он заявлен, не требуется, однако и вызвать его из экземпляра данного класса невозможно. Абстрактный метод всегда является виртуальным (помечен ключевым словом virtual) или динамическим (помечен ключевым словом dynamic) и может быть переопределен в одном из классов-потомков. Соответственно, из экземпляров классов, переопределивших абстрактный метод, его вызов возможен.

Правила наследования классов

Наследование — это построение нового класса на основе ранее описанного. Полученные в результате наследования классы называются классами-наследниками (или дочерними классами), а классы, на основе которых они построены — классами-родителями (или родительскими классами). При наследовании дочерний класс приобретает все свойства и методы родительского класса и имеет доступ к любому члену родительского класса,за исключением описанных с областью видимости private. При описании дочернего класса с использованием наследования имя родительского класса указывается в скобках после ключевого слова class в заголовке интерфейсной части описываемого класса. Класс-наследник может быть описан на основе любого другого класса, вне зависимости от того, является ли родительский класс в свою очередь дочерним. Все классы в Delphi являются наследниками класса TObject, даже если это явно не указывается. 

Сущность полиморфизма

Переменной-ссылке на экземпляр класса можно присвоить реальную ссылку на экземпляр другого класса, если они состоят в отношении родитель-наследник. Так как при наследовании классов друг от друга количество свойств и методов не уменьшается, то присваиваемый объект может быть экземпляром класса, находящимся ниже по иерархии, чем тот, который был указан при описании переменной. Как и все объектно-ориентированные языки программирования, Delphi поддерживает свойство полиморфизма объектов при наследовании, которое состоит в правильном выборе виртуального метода, вызываемого из переменной-ссылки на объект. Вне зависимости от того, на экземпляр какого класса указывает переменная-ссылка в соответствии со своим описанием, будет вызван тот виртуальный метод, который описан в классе, на который указывает реальная ссылка.

Правила переопределения методов

Для переопределения метода, реализованного в объекте-родителе, следует:

  • указать его заголовок в описании дочернего объекта без изменения имени, списка параметров и возвращаемого значения (если метод является функцией);
  • указать после заголовка метода ключевое слово override;
  • реализовать метод в описательной части объекта по обычным правилам. Если ключевое слово override не указано, то метод не переопределяется.

Чтобы метод мог быть переопределен в дочерних классах, он должен быть помечен ключевыми словами virtual или dynamic в интерфейсной части класса-родителя.

Разница между использованием ключевых слов virtual и dynamic

Ключевое слово virtual указывает на то, что метод должен быть занесен в так называемую таблицу виртуальных методов (ТВМ), а ключевое слово dynamic — на то, что метод должен быть найден по имени в дереве родительских объектов. Разница между использованием virtual или dynamic заключается в направлении оптимизации компилятором вызовов переопределяемых методов. Методы, помеченные virtual, оптимизируются по скорости, а dynamic-методы по размеру программного кода. В большинстве случаев рекомендуется использование виртуальных методов, а использование динамических методов целесообразно при высоких степенях вложенности связей родитель-наследник.

Возможности определения типа объекта во время выполнения программы и приведение типов объектов.

Для определения, к какому именно классу принадлежит объект, на который указывает некоторая ссылочная переменная, в Delphi предусмотрен оператор is, возвращающий значение true, если объект является экземпляром заданного класса, или класса-наследника, или false, если объект не принадлежит заданному классу и его наследникам. После определения факта принадлежности к классу объект можно привести к заданному типу для получения доступа к свойствам и методам, заявленным в этом классе, а не в классе, тип которого указан в ссылочной переменной. Для приведения к заданному классу используется оператор as.

Жизненный цикл экземпляра класса. Конструктор экземпляров класса.

Жизненный цикл экземпляра класса представляет собой его создание с помощью вызова конструктора, использование свойств и методов экземпляра класса и последующее разрушение структур объекта с помощью вызова деструктора.

Конструктор наследуется автоматически всеми классами от коренного класса TObject и выполняет две основных функции:

  • Выделяет память под структуры данных, необходимые для поддержания жизнедеятельности объекта, то есть инициализирует объект; заполняет порядковые (целочисленные, логические, перечислимые и интервальные) свойства объекта нулевыми значениями; устанавливает нулевые ссылки (значение null) для свойств-указателей; а также устанавливает нулевые длины строкам.
  • Возвращает ссылку на объект, которую можно сохранить в переменной для доступа к свойствам и методам объекта, а также для его последующего разрушения.

Конструктор может быть переопределен в описании класса для выполнения дополнительной инициализации, характерной экземплярам именно этого класса. Например, в конструкторе можно установить начальные значения свойств. Переопределение конструктора выполняется по обычным правилам переопределения методов, за исключением следующих моментов:

  • Конструктор родительского класса не должен быть обязательно помечен ключевым словом virtual, для того, чтобы его переопределить. Соответственно, если конструктор родительского класса не помечен как виртуальный или динамический, не требуется указание ключевого слова override в описании дочернего класса.
  • Существенным отличием в переопределении конструкторов и обычных методов является возможность изменения параметров конструктора дочернего класса, относительно конструктора родительского класса. Однако это возможно, только если конструктор не является виртуальным.

Для вызова версии конструктора, замененной в классе-наследнике, используется ключевое слово Inherited.

Деструктор класса экземпляров класса.

Объект естественным образом занимает место в памяти, которая необходима для хранения как свойств объекта, так и дополнительной информации, например, таблицы виртуальных методов. Для разрушения объекта и освобождения памяти, которая выделена для него в конструкторе, предназначен деструктор — специализированный метод, изначально определенный в классе TObject. Если в конструкторе объекта производится выделение памяти под какие-либо ресурсы или объект регистрируется в других объектах, передавая им ссылку на себя, то возникает необходимость переопределения деструктора для освобождения памяти и разрушения связей с другими элементами программы. При переопределении деструктора необходимо указывать ключевое слово override, так как деструктор является виртуальным методом (помечен ключевым словом virtual в описании класса TObject). Последней командой описательной части деструктора должен быть вызов переопределенного деструктора родительского класса. Прямой вызов деструктора не применяется для уничтожения экземпляра класса, так как для этого предназначен метод Free, также описанный в классе TObject. Данный метод не может быть переопределен, так как не имеет в своем описании ключевого слова virtual, однако метод Free вызывает конструктор Destroy, поведение которого может быть специфическим.

Описание и использование специальных свойств объекта property.

Свойства property аналогичны свойствам объекта в смысле их использования. Однако такие свойства не являются простым отображением памяти, доступным для чтения и изменения, а подразумевают вызов методов объекта. Описание свойств property в простейшем виде выглядит следующим образом:

property <Имя свойства>: <Тип> read <Функция чтения значения> write <Процедура установки значения>;

Когда вызывающая подпрограмма обращается к свойству property для получения его значения, вместо конкретного значения возвращается результат функции, указанной по имени после модификатора read. Аналогично производится установка значения свойства — вместо прямой записи значения вызывается процедура, указанная после модификатора write. Соответственно, данная процедура должна принимать один параметр, причем его тип должен быть таким же, как тип самого свойства.

Ссылка Self

Ссылка Self может использоваться при разработке методов классов для указания на конкретный экземпляр, из которого вызван метод.

Особенности программирования в ОС Windows

В Windows реализуется схема программ, управляемых событиями. Это значит, что каждая программа представляет собой набор подпрограмм, некоторые из которых вызываются непосредственно ядром операционной системы для реакции на какое-либо событие, произошедшее в системе. При этом ни одно приложение не может ждать совершения события, монополизируя, таким образом, ресурсы и приостанавливая работу других приложений. Анализом изменений в системе и рассылкой сообщений занимается непосредственно операционная система. Каждой программе в Windows сопоставляется некоторая область на экране, в которую можно выводить информацию — окно. Оконное представление программ отвечает условиям, накладываемым на систему многозадачностью, так как несколько приложений одновременно не могут выводить свою информацию в одно и то же место. В любой момент времени одно из окон «находится в фокусе» (является «активным») и потоки вводимой информации направляются операционной системой в программу, которой принадлежит это окно. Механизм такого перенаправления потоков ввода основан на событиях.

Механизм сообщений в ОС Windows

Windows следит за изменениями в состоянии системы (нажатие клавиш, перемещение мыши и нажатие ее кнопок, и т.д.) и генерирует специальные структуры данных, которые содержат следующую информацию:

  • Ссылка на окно, которое находилось в фокусе, когда произошло событие.
  • Идентификатор события.
  • Дополнительная информация для данного события.

Далее эти пакеты сохраняются в очереди сообщений Windows, а ядро опять переходит в режим слежения за системой. С другой стороны, очередь непрерывно разбирается, анализируется ссылка на окно, которому предназначено событие, и вызывается его оконная функция — специальная подпрограмма, описанная по определенным правилам и зарегистрированная в операционной системе как объект назначения для сообщений.

Вызванная оконная функция должна проанализировать событие по его идентификатору, используя дополнительные параметры, выполнить действия, обусловленные логикой программы, и вернуть в качестве результата функции код завершения обработки.

Определение исключительной ситуации

Исключительная ситуация (исключение) — это некоторая ситуация времени выполнения программы, которая требует специальной обработки. К таким событиям относятся ошибки времени выполнения программы, например, деление на ноль или попытка чтения информации из несуществующего файла.

Объекты-исключения в Delphi

При возникновении исключительной ситуации Delphi создает экземпляр некоторого класса, в зависимости от характера произошедшей ошибки и вызывает команду Raise, передавая ей ссылку на этот объект. Все такие классы являются наследниками класса Exception, что позволяет им быть «узнаваемыми» для Delphi. После вызова команды Raise по очереди прерываются подпрограммы, вызвавшие ту подпрограмму, в которой произошла исключительная ситуация. Данный процесс останавливается, когда в одной из подпрограмм стека обнаруживается обработчик соответствующего класса исключительных ситуаций. Любая подпрограмма может сама сгенерировать исключительную ситуацию с помощью оператора Raise.

Методы обработки исключительных ситуаций

Когда некоторый фрагмент программного кода необходимо защитить от досрочного завершения по ошибке, его следует заключить в блок обработки исключения. Таких блоков в Delphi предусмотрено два:

  • Блок обработки исключений Try..Except пытается выполнить заданный фрагмент программы, а, в случае появления исключения, передает управление специальному обработчику, расположенному в секции Except. Блок обработки исключений Try..Except может быть использован в ситуациях, когда известно, как именно нужно реагировать на произошедшую ошибку, даже если программа и не пытается установить ее тип.
  • Когда реакция программы на ошибку не так важна, как корректное завершение фрагмента программы, вызвавшего эту ошибку, может быть использован блок обработки исключений Try..Finally. При его использовании вне зависимости от корректности работы основного фрагмента программы, управление всегда передается в секцию Finally, где обычно производятся действия по возврату системе ресурсов, полученных перед входом в блок обработки исключения.

Основные свойства и методы классов-списков

Для всех классов-списков, кроме TStack и TQueue, определены методы добавления, удаления и вставки элементов Add, Delete и insert. Всеми классами поддерживается метод Clear, удаляющий из списка все элементы. Количество элементов, которое находится в данный момент в списке, и потенциально возможное количество хранимых элементов без дополнительных операций выделения памяти, можно получить с помощью свойств Count и Capacity. Для доступа к элементам списков, которые унаследованы от TList, используется индексное свойство items. К массивам строк, хранимых в экземплярах классов TStringList, и связанным с ними объектам можно обращаться через свойства strings и Objects, а стеки TStack и очереди TQueue выдают свои элементы при их удалении из списка, либо с помощью команды Peek. Классы TStack и TQueue имеют особенности в системе организации свойств и методов в связи с тем, что организуют структуры для последовательного доступа. Добавление элементов в них осуществляется методом Push, а удаление методом Pop.

Особенности классов-списков, предназначенных для хранения объектов.

Для хранения объектов с произвольным доступом к ним, то есть экземпляров классов, предназначены классы TObjectList, TComponentList и TCollection. Особенностью этих классов является возможность владения хранимыми объектами в смысле их разрушения при разрушении самих списков, или при удалении элементов. Разрушение производится методом Free и снимает с программы, использующей списки, ответственность за корректное освобождение памяти, выделенной под эти объекты, что существенно снижает риск появления динамических ошибок и повышает надежность программы. Первые два класса производят разрушение объектов опционально, при истинном значении свойства OwnsObjects, а класс TCollection владеет хранимыми в нем объектами полностью.

Классы-списки последовательного доступа TObjectstack и TObjectQueue не имеют средств для разрушения хранимых объектов, так как имеют другую логическую направленность — они предназначены для временного хранения экземпляров классов, и объекты, которые хранятся в таких списках, должны быть изъяты оттуда какими-либо фрагментами программы.

Возможности и особенности хранения строковых массивов в классах-наследниках TStrings.

Для хранения массивов строк в Delphi описан базовый класс TStrings, в котором объявлены абстрактные методы, описывающие основные действия, такие как:

  • добавление, вставка и удаление строк из массива с возможностью доступа по индексу, а также просто доступ к строке по индексу;
  • упорядочивание строк внутри массива;
  • загрузка массива из файла или потока и сохранение в файл или поток;
  • сопоставление объектов строкам в массиве для хранения более сложных данных или расширенных параметров строк.

Помимо обычных для представления информации в виде списков методов Add, Delete и Insert, в классе TStringList предусмотрены методы для добавления строк со связанными объектами AddObject и insertobject. Получение информации также ориентировано на текстовый характер хранимых данных, например, поддерживается возможность получения всего массива строк в виде одной строки, причем в различных форматах, в зависимости ОТ используемого свойства — Text, CommaText или DelimitedString.

Строковые массивы поддерживают возможность сохранения информации в файл или поток и чтения ее оттуда. Поддерживается автоматическое упорядочивание строк по алфавиту и контроль уникальности.

Понятие потока и преимущества использования потоков по отношению к традиционным методам чтения/записи данных.

Потоком называют программный интерфейс к некоторому устройству ввода/вывода. Абстрактное устройство представлено в Delphi классом TStream, а наследники этого базового потокового класса реализуют интерфейс, заявленный в нем, и поддерживают методы чтения и записи информации для конкретного устройства. Можно назвать следующие преимущества использования потоков по отношению к традиционным методам ввода/вывода:

  • существенное снижение сложности программного продукта за счет объектно-ориентированного подхода в результате использования единого интерфейса к разным устройствам ввода/вывода;
  • повышение гибкости программного продукта в смысле изменений, так как логика процессов ввода/вывода разбивается на две части — манипуляции с самим потоком (его создание и разрушение) и непосредственные операции ввода/вывода, то есть операции с информацией;
  • дополнительные возможности временного хранения информации в памяти с возможностью ее быстрого сохранения на любой носитель за счет совместимости разных потоков между собой.

Потоковые классы, предназначенные для работы с реальными устройствами.

В стандартной поставке Delphi, кроме базового класса TStream, реализованы следующие потоковые классы:

  • TFileStream, предназначенный для работы с файлами;
  • TStringStream, предназначенный для работы со строками, хранимыми в оперативной памяти;
  • TMemoryStream, предназначенный для работы с динамической памятью;
  • TBlobStream, предназначенный для работы с двоичными BLOB-полями баз данных;
  • TWinSocketstream, предназначенный для работы с сетевыми соединениями;
  • TOleStream, предназначенный для ввода/вывода информации в OLE-объектах.

Файловые потоки

Файловые потоки — это потоки, связанные с файлами. Файловые потоки реализованы с помощью класса TFileStream. При создании экземпляров данного класса в конструктор передаются параметры, определяющие название файла, с которым связан поток, режим, в котором файл должен быть открыт (для чтения, записи, или в смешанном режиме), а также способ разделения файла с другими приложениями (другим приложениям запрещено считывать информацию из данного файла, записывать информацию в файл, считывать и записывать, либо разрешены все действия).

Потоки, построенные на основе оперативной памяти

Класс TMemoryStream представляет собой поток для временного хранения информации в оперативной памяти. Такие потоки могут использоваться для временного хранения информации и передачи ее в другой поток для записи на какой-либо носитель.

Удобство такого метода хранения информации заключается в совместимости потоков TMemoryStream с другими потоками, в результате чего информация, хранимая в этом потоке, может быть легко скопирована в другой поток, например с помощью метода CopyFrom. Интересной особенностью потоков TMemoryStream является возможность сохранения информации в файл и чтения ее из файла с помощью методов SaveToFile и LoadFromFile.

Строчные потоки, построенные на основе оперативной памяти

Строчные потоки используются для доступа к строкам, хранимым в памяти, и реализованы в виде класса TStringStream. В каждом экземпляре такого класса хранится одна строка, доступ к которой возможен с помощью обычных методов, характерных для потоков, то есть Read, Write, и другими. Если программе, использующей такой поток, необходим доступ к хранимой информации, как к строке в целом, то ссылка на строку может быть получена с помощью свойства DataString. Особенностью строчных потоков является возможность записи и чтения строк с помощью методов WriteString и ReadString.

Понятие графического контекста Windows

Операционная система Windows является многозадачной, поэтому в ней запрещен непосредственный доступ к устройствам, в том числе и к видеокарте, так как это может вызвать конфликт между приложениями. Вместо непосредственного взаимодействия с аппаратной частью предназначен программный интерфейс, представляемый операционной системой в виде набора системных API-функций. Для того, чтобы идентифицировать какое-либо устройство, Windows использует понятие его контекста (DC), с которым и производятся все необходимые операции. Для вывода графической информации на экран, принтер и другие аналогичные им устройства используется специальная разновидность контекста устройства — графический контекст, представляющий собой описание параметров графического устройства и используемый по ссылке (НОС). Ссылка на графический контекст передается API-функциям в качестве одного из параметров, в результате чего выводимая информация попадает на необходимое устройство. Контекст графического устройства имеет следующий набор характеристик:

  • стиль и цвет обводки;
  • стиль и цвет заливки;
  • шрифт для вывода текстовой информации.

Представление графического контекста Windows в Delphi

В Delphi графический контекст Windows инкапсулирован в класс TCanvas, представляющий собой область отображения, и имеющий множество методов для вывода графической информации, например:

  • отрезков и ломаных линий;
  • прямоугольников, в том числе со скругленными краями;
  • окружностей, эллипсов и дуг;
  • кривых Безье;
  • текстовой информации.

Также поддерживается заливка любой замкнутой области. Характеристики контекста также представляются экземплярами классов. Для хранения параметров обводки используется класс TPen, для хранения характеристик заливки — класс TBrush, а для хранения информации о шрифте — класс TFont.

Форматы графических файлов, поддерживаемых Delphi.

В Delphi реализована поддержка следующих графических форматов:

  • Формат BMP представляет собой растровое изображение, хранимое в виде карты точек без сжатия. Изображения могут иметь различную цветность — от монохромной до TrueColor. Файлы с такими изображениями имеют размеры, пропорциональные размерам самого изображения и существенно зависят от количества используемых цветов.
  • Формат JPEG представляет собой растровые изображения, использующие сжатие с потерей качества. Изображения в данном формате являются либо полноцветными (TrueColor), либо черно-белыми (256 градаций серого цвета). Файлы с такими изображениями занимают немного места на диске, и их размер зависит не только от размеров и цветности самого изображения, но и от степени его сжатия.
  • В формате ICO представляется изображение, используемое для вывода Windows-иконок, и существенно отличается от других растровых изображений наличием прозрачной фоновой области, не затирающей нижележащую информацию при выводе на экран. Работа с такими изображениями более сложна, чем с изображениями, хранимыми в других форматах.
  • В формате EMF представляется последовательность команд вывода графической информации на экран. Данный формат поддерживает весь спектр API-функций Windows, ориентированных на вывод графической информации, и фактически является векторным. Существенным его отличием от растровых форматов является возможность качественного масштабирования изображения при выводе, пропорциональность размеров файлов хранимой информации, но, с другой стороны, он отличается более долгим выводу на экран с вероятностью неприятных для пользователя эффектов.

Другие форматы Delphi не поддерживаются и требуют модулей сторонних разработчиков. Однако приведенный набор форматов перекрывает весь спектр возможных применений графических изображений с учетом различных особенностей.

Средства хранения графических изображений в Delphi.

Для хранения графических изображений в Delphi предусмотрен класс TGraphic и унаследованные от него TBitmap, TGPEGlmage, Tlcon и TMetafile, предназначенные для хранения, соответственно растровых изображений, JPEG-изображений, иконок и метафайлов. Все перечисленные классы, так или иначе, поддерживают загрузку информации из файлов или потоков, поэтому могут быть легко использованы в программных продуктах. Для хранения изображения в одном из форматов, в Delphi имеется класс TPicture, являющийся оболочкой для всех специализированных классов. Экземпляры класса TPicture имеют возможность считывать графические файлы по заданному имени, анализируя расширение файла для использования соответствующего метода чтения.

Страница: 1 2 3 4 5 6 7