Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OAP_Vopros_5_KLASSY_I_OB_EKTY.doc
Скачиваний:
12
Добавлен:
30.04.2015
Размер:
77.82 Кб
Скачать

2. Методы. Инкапсулированные в классе процедуры и функции называются методами. Они объявляются также, как и обычные подпрограммы:

Type

TMyClass=class

Function MyFunc(aPar:Integer):Integer;

Procedure MyProc;

End;

Доступ к методам класса, как и к его полям, возможен с помощью составных имен:

Var

AObject:TMyClass;

Begin

AObject.MyProc;

End;

Методы класса могут перекрываться в потомках.

Type

TparentClass=class

Procedure DoWork;

End;

TchildClass=class(TparentClass)

Procedure DoWork;

End;

Потомки обоих классов могут выполнять сходную по названию процедуру DoWork, но, в общем случае, будут делать это по-разному. Такое замещение методов называется статическим, т.к. реализуется компилятором.

В Object Pascal гораздо чаще используется динамическое замещение методов на этапе прогонки программы. Для реализации этого метод, замещаемый в родительском классе, должен объявляться как динамический (с директовой dynamic) или виртуальный (virtual). Встретив такое объявление, компилятор создаст две таблицы – DMT (Dynamic Method Table) и VMT (Virtual Method Table) и поместит в них адреса точек входа соответственно динамических и виртуальных методов. При каждом обращении к замещаемому методу компилятор вставляет код, позволяющий извлечь адрес точки входа в подпрограмму из той или иной таблицы. В классе-потомке замещающий метод объявляется с директивой override (перекрыть). Получив это указание, компилятор создаст код, который на этапе прогона программы поместит в родительскую таблицу точку входа метода класса-потомка, что позволит родителю выполнить нужное действие с помощью нового метода.

Разница между динамическими и виртуальными методами состоит в том, что таблица динамических методов DMT содержит адреса только тех методов, которые объявлены как dynamic в данном классе, в то время как таблица VMT содержит адреса всех виртуальных методов не только данного класса, но и всех его родителей. Значительно большая по размеру таблица VMT обеспечивает более быстрый поиск, в то время как при обращении к динамическому методу программа сначала просматривает таблицу DMT у объекта, затем – у его родительского класса и так далее, пока не будет найдена нужная точка входа.

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

Конструкторы и деструкторы

В состав любого класса входят два специальных метода – конструктор и деструктор. У класса Tobject эти методы называются Create и Destroy, так же они называются и в подавляющем большинстве потомков. Конструктор распределяет объект в динамической памяти и помещает адрес этой памяти в переменную Self, которая автоматически объявляется в классе. Деструктор удаляет объект из кучи. Обращение к деструктору должно предварять любое обращение к полям и некоторым методам объекта. По своей форме конструкторы и деструкторы являются процедурами, но объявляются с помощью зарезервированных слов Constructor и Destructor:

Type

TMyClass=class

IntField:Integer;

Constructor Create(Value:Integer);

Destructor Destroy;

End;

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

Var

MyObject:MyClass;

Begin

MyObject:=TmyClass.Create;

MyObject.Free;

End;

В базовом классе TObject определен метод Free, который сначала проверяет действительность адреса объекта и лишь затем вызывает деструктор Destroy.

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

Constructor TmyClass.Create(Value:Integer);

Begin

Inherited Create; // вызываем унаследованный конструтор

End;

Некоторые методы могут вызываться без создания и инициации объекта. Такие методы называются методами класса, они объявляются с помощью зарезервированного слова class:

Type

TMyClass=class

Class Function GetClassName:String;

End;

Var

S:String;

Begin

S:=TMyClass.GetClassName;

End;

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

Конструктор применяется к классу и к объекту. Если конструктор применяется к классу,

DiskGauge:=TdiskGauge.Create;

то выполняется следующая последовательность действий:

  • в динамической памяти выделяется место для нового объекта;

  • выделенная память заполняется нулями;

  • выполняются заданные программистом действия конструктора;

  • ссылка на созданные объект возвращается в качестве значения конструктора; тип возвращаемого значения совпадает с типом класса, использованного при вызове.

Если конструктор применяется к объекту

DiskGause.Create;

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

Деструктор уничтожает объект, к которому применяется, в результате:

  • выполняется заданный программистом код деинициализации,

  • освобождается занимаемая объектом динамическая память.