Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Reader._AddRef

Абстрактный виртуальный метод | Методы обработки сообщений | Понятие ссылки на метод объекта | Понятие события | Ошибки и исключительные ситуации | Классы исключительных ситуаций | В тот момент, когда управление передается на Except, в программе считается, что ошибка обработана. | Для возврата по try используется стек вызова процедур. | Приемы надежного программирования | Описание интерфейса |


End;

 

Копия не создается, если входной параметр описан с ключевым словом const:

p rocedure LoadItems(const R: ITextReader);

 

Var

Reader: ITextRedaer;

Begin

...

LoadItems(Reader); // Копия не создается, метод_AddRef не вызывается

End;

 

Интерфейсная переменная уничтожается при выходе из области действия переменной, а это

значит, что у нее автоматически вызывается метод _ Release:

 

Var

Intf: ITextRedaer;

Begin

Intf:= TDelimitedReader.Create('MyData.del', ';');

...

end; // Intf._Release

 

Расширение интерфейса

 

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

IExtendedTextReader = interface(ITextReader)

procedure SkipLines(Count: Integer);

end;

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

 

В языке Delphi существует предопределенный интерфейс IInterface, который служит неявным базовым интерфейсом для всех остальных интерфейсов.

ITextReader = interface ~ TextReader = interface(IInterface)

Описание интерфейса IInterface находится в стандартном модуле System:

Type

IInterface = interface

['{00000000-0000-0000-C000-000000000046}']

Function QueryInterface(constIID: TGUID; out Obj): HResult; stdcall;

Function _AddRef: Integer; stdcall;

Function _Release: Integer; stdcall;

End;

Методы интерфейса IInterface явно или неявно попадают во все интерфейсы и имеют особое назначение. Метод QueryInterface нужен для того, чтобы, имея некоторый интерфейс, запросить у объекта другой интерфейс. Этот метод автоматически вызывается при преобразовании одних интерфейсов в другие. Метод _ AddRef автоматически вызывается при присваивании значения интерфейсной переменной. Метод _ Release автоматически вызывается при уничтожении интерфейсной переменной. Последние два метода позволяют организовать подсчет ссылок на объект и автоматическое уничтожение объекта, когда количество ссылок на него становится равным нулю. Вызовы всех трех методов генерируются компилятором автоматически, и вызывать их явно нет необходимости, однако программист должен позаботиться об их реализации.

 


Дата добавления: 2015-11-16; просмотров: 51 | Нарушение авторских прав


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

mybiblioteka.su - 2015-2024 год. (0.006 сек.)