Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Type <имя объявляемого класса> = class(<имя родителя>)
private <скрытые элементы класса>
protected <защищенные элементы класса>
public <общедоступные элементы класса>
published <опубликованные элементы класса>
automated <элементы, реализующие OLE-механизм>
end;

Имя родителя указывать не обязательно, по умолчанию считается, что, если имя родителя не указано, то класс непосредственно наследуется от TObject.
Внутри описания класса выделяется до пяти секций.
Секция private содержит внутренние элементы, обращение к которым возможны только в пределах модуля (а не класса, как в С++), содержащего объявление класса.
Секция protected содержит защищенные элементы, которые доступны в пределах модуля, содержащего объявление класса, и внутри потомков класса.
Секция public содержит общедоступные элементы, к которым возможно обращение из любой части программы.
Секция published содержит опубликованные элементы, которые по ограничению доступа аналогичны public. Для визуальных компонент, вынесенных на панель компонент, информация об элементах, размещенных в этой секции, становится доступной через Инспектор Объектов.
Секция automated содержит элементы, доступ к которым также выполняется аналогично public. Но для элементов, описанных в этой секции генерируется дополнительная информация, используемая OLE. Секцию имеет смысл объявлять для потомков класса TAutoObject.

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

НЕ нашли? Не то? Что вы ищете?

Типы методов

Методы объекта могут быть описаны как статические (static), виртуальные (virtual), динамические (dynamic) или как методы обработки сообщения (message), для чего к ним добавляются соответствующие директивы.

Статические методы. Статические методы работают подобно обычным процедурам или функциям. Этот тип методов устанавливается по умолчанию. Адрес такого метода известен уже на стадии компиляции, и компилятор в коде программы оформляет все вызовы данного метода как статические. Такие методы работают быстрее других, однако не могут быть перегружены в целях полиморфизма объектов.

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

Динамические методы. Динамические методы в целом подобны виртуальным методам, но обслуживаются другой диспетчерской системой. Каждому динамическому методу компилятор назначает уникальное число и использует его вместе с адресом метода для построения таблицы динамических методов (DMT - Dynamic Method Table), В отличие от VMT, DMT содержит методы лишь данного объекта, благодаря чему обеспечивается экономия используемой памяти, но замедляется вызов метода, поскольку для поиска его адреса, скорее всего, будет пересмотрена не одна DMT в иерархии объектов.

Методы обработки сообщения. Методы обработки сообщений предназначены аля обработки приходящих сообщений, с помощью которых происходит обмен информацией в операционной системе Windows. Значение после ключевого слова message определяет сообщение, в ответ на которое вызывается данный метод. Такие методы создаются для реакции на те или иные сообщения Windows.

Контрольные вопросы

От какого класса наследуются все классы, используемые в Delphi Формат описания нового класса Сколько и какие секций выделяется внутри описания класса Что представляют собой методы

Лекция 12

Тема: Объектная модель Delphi Pascal. Свойства. Простые свойства. Свойства – массивы. Индексированные свойства. Метаклассы. Ссылка на класс (метакласс). Операции is и as. Методы класса.

Цель: познакомить со свойствами, метаклассами, познакомить со свойствами-массивами

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

Объявление массива

Массив, как и любая переменная программы, перед использованием должен быть объявлен в разделе объявления переменных. В общем виде инструкция объявления массива выгладит следующим образом: Имя: [нижний_индекс..верхний_индекс] of тип

где:

    имя — имя массива; array — зарезервированное слово языка Delphi, обозначающее, что объявляемое имя является именем массива; нижний_индекс и верхний_индекс — целые константы, определяющие диапазон изменения индекса элементов массива и, неявно, количество элементов (размер) массива; тип — тип элементов массива. Memol. Lines[0] := 'Строка';

Свойства-массивы имеют перечисленные ниже особенности.

    Свойства-массивы объявляются с указанием одного или нескольких индексных параметров. Тип индексов должен быть целым или строковым (в отличие от обычных массивов, свойства-массивы могут индексироваться строками). Доступ к значению свойства-массива может быть только косвенным (через методы SetXXXX/GetXXXX). Если в определении свойства-массива используется несколько индексов (многомерные свойства-массивы), методы доступа должны содержать параметры для каждого индекса в том же порядке, что и в объявлении свойства. Свойства-массивы нельзя объявлять в секции published. Доступ к значениям свойства-массива на этапе конструирования возможен только с помощью специализированного редактора свойств.

Метаклассы. Ссылки на классы

Язык Object Pascal позволяет рассматривать классы как своего рода объекты, которыми можно манипулировать в программе. Такая возможность рождает новое понятие — класс класса; его принято обозначать термином метакласс.

Для поддержки метаклассов введен специальный тип данных — ссылка на класс (class reference). Он описывается с помощью словосочетания class of, например:

Code:

type

TResourceGaugeClass = class of TResourceGauge;

Переменная типа TResourceGaugeClass объявляется в программе обычным образом:

Code:

var

ClassRef: TResourceGaugeClass;

Значениями переменной ClassRef могут быть класс TResourceGauge и все порожденные от него классы. Допустимы, например, следующие операторы:

Code:

ClassRef := TResourceGauge;

ClassRef := TDiskGauge;

ClassRef := TMemoryGauge;

По аналогии с тем, как для всех классов существует общий предок TObject, у ссылок на классы существует базовый тип TCIass:

Code:

type TCIass = class of TObject;

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

Контрольные вопросы

Что такое массив? Как объявить массив? Какие особенности имеют свойства-массивы?

Лекция 13

Тема: Объектная модель Delphi Pascal. Механизм определения типов на этапе выполнения программы. Делегирование методов. Библиотека стандартных классов Delphi. Отношения «основной - вспомогательный» и «старший - младший».

Цель: познакомить с библиотекой стандартных классов Delphi

Помимо наследования и перекрытия методов родителя Delphi дает еще одну возможность модифицировать поведение того или иного объекта. Речь идет о делегировании метода одного объекта другому.

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

type

TNotifyEvent = procedure(Sender: TObject); TMyClass = class

FaEvent: TNotifyEvent of object;

end;

TAnotherClass - class

procedure MyEvent(Sender: TObject);

end;

Теперь экземпляр класса TAnotherClass может делегировать свою процедуру MyEvent объекту класса TMyClass:

var

FMyClass: TMyClass; FAnotherClass: TAnotherClass; begin

FMyClass TMyClass. Create; FAnotherClass := TAnotherClass. Create; FMyClass. FaEvent := FAnotherClass. MyEvent;

end;

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

Библиотека стандартных классов Delphi VCL содержит сотни классов, на базе которых разработчик может создавать собственные приложения Windows.

На рисунке ниже показана иерархия основных базовых классов библиотеки VCL, на базе которых созданы все остальные классы Delphi.




Рис. Иерархия классов основных компонент библиотеки VCL

Как уже упоминалось ранее, все компоненты библиотеки наследуются от класса TObject, который содержит целый ряд специальных методов существенно снижающих сложность программирования в Delphi:

type TObject = class
constructor Create; {конструктор}
destructor Destroy; virtual; {деструктор}
procedure Free; {уничтожить, если элемент был создан}
class Function InitInstance(Instance: Pointer): TObject; {инициализирует память при создании объекта}
class Function NewInstance: TObject; virtual; {выделяет пямять для размещения объекта}
Procedure CleanupInstance; {осуществляет корректное завершение работы со строками и другими сложными структурами при уничтожении объекта}
Procedure FreeInstance; virtual; {освобождает память, выделенную под размещение объекта}
Function ClassType: TClass;{возвращает класс объекта}
class Function ClassName: ShortString; {возвращает имя класса}
class Function ClassNameIs(const Name: string): Boolean; {проверяет принадлежность объекта указанному классу}
class Function ClassParent: TClass;{возвращает тип предка}
class Function ClassInfo: Pointer;{возвращает указатель на таблицу RTTI}
class Function InstanceSize: Longint;{возвращает размер объекта в байтах}
class Function InheritsFrom(AClass: TClass): Boolean;{проверяет принадлежность класса или объекта семейству указанного класса}
Procedure Dispatch(var Message);{посылает сообщение объекту}
class Function MethodAddress(const Name: ShortString): Pointer; {возвращает адрес опубликованного метода по имени}
class Function MethodName(Address: Pointer): ShortString;
{возвращает имя опубликованного метода по его адресу}
Function FieldAddress(const Name: ShortString): Pointer;
{возвращает адрес опубликованного поля по его имени}
Function GetInterface(const IID: TGUID; out Obj): Boolean; {проверяет соответствие указанного интерфейса класс}
class Function GetInterfaceEntry(const IID: TGUID):
PInterfaceEntry; {возвращает указатель на структуру, содержащую описание специального интерфейса класса}
class Function GetInterfaceTable: PInterfaceTable; {возвращает указатель на структуру, содержащую описание интерфейса для класса}
Function SafeCallException(ExceptObject: TObject;
ExceptAddr: Pointer): Integer; virtual; {метод поддержки исключение OLE}
Procedure DefaultHandler(var Message); virtual;{выполняет обработку сообщения по умолчанию}
end;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24