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