АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Поскольку интерфейс не может содержать поля, все его свойства отображены на его методы

Читайте также:
  1. А если и может, то Конституционный суд отменит это решение в пять минут.
  2. А) самого страхователя или иного лица, на которое такая ответственность может быть возложена в пользу выгодоприобретателя; ???????????
  3. АК. Структура белков, физико-химические свойства (192 вопроса)
  4. Активные минеральные добавки. Смешанные цементы, их свойства.
  5. Анализ свойства вязкости
  6. Антигены, основные свойства. Антигены гистосовместимости. Процессинг антигенов.
  7. Арифметическая середина и ее свойства.
  8. Арифметические операции над последовательностями. Свойства пределов, связанные с арифметическими операциями над последовательностями.
  9. Б.1.19 Каким баллом может быть оценено качество сварных соединений по ОП № 501 ЦД-75?
  10. Без предварительного установления точного текста не может существовать ни история, ни теория литературы.
  11. Биохимические свойства.
  12. Более подробно о том, как смягчить грех аборта или освободиться от него, Вы можете прочитать в Журнале «Благодарение с любовью» № 4.

Поддержка интерфейса классом

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

TTextReader = class(TObject, ITextReader)

Такая запись означает, что класс TTextReader унаследован от класса TObject и реализует интерфейс ITextReader. Класс, реализующий интерфейс, должен содержать код для всех методов интерфейса.

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

TTextReader = class(TInterfacedObject, ITextReader)

 

При наличии в интерфейсах нескольких одинаковых функций:

 

function NetxItem: String;

function IStringIterator.Next:= NextItem;

 

Механизм подсчета ссылок в интерфейсах

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

 

Var

Intf, Copy: IInterface;

Begin

Copy:= Intf; // Copy._Release; Intf._AddRef;

Intf:= nil; // Intf._Release;

End; // Copy._Release

Стандартная реализация методов _ AddRef и _ Release находится в классе TInterfacedObject.

Type

TInterfacedObject = class(TObject, IInterface)

...

FRefCount: Integer; // Счетчик ссылок

function_AddRef: Integer; stdcall;

function_Release: Integer; stdcall;

...

end;

function TInterfacedObject._AddRef: Integer;

Begin

Result:= InterlockedIncrement(FRefCount); // Увеличение счетчика ссылок

end;

function TInterfacedObject._Release: Integer;

Begin

Result:= InterlockedDecrement(FRefCount); // Уменьшение счетчика ссылок

If Result = 0 then // Если ссылок больше нет, то

Destroy; // уничтожение объекта

end;

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

Var

Obj: TDelimitedReader;

Intf, Copy: ITextReader;

Begin

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

Intf:= Obj; // Obj._AddRef -> Obj.FRefCount = 1

Copy:= Intf; // Obj._AddRef -> Obj.FRefCount = 2

...

Intf:= nil; // Obj._Release -> Obj.FRefCount = 1

Copy:= nil; // Obj._Release -> Obj.FRefCount = 0 -> Obj.Destroy

Obj.Free; // Ошибка! Объект уже уничтожен и переменная Obj указывает в никуда

end;

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

Var

Intf: ITextReader;

Begin

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

...

Intf:= nil; // FRefCount = 0 -> Destroy

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 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)