| 1.1 Зачем использовать интерфейс? Например: существует такая услуга по продаже билетов, кинотеатры могут продавать билеты, оперные дома могут продавать билеты, а пассажирские станции также могут продавать билеты. Услуги по продаже билетов? Вы должны знать, что даже менеджеры могут продавать билеты, что, очевидно, не подходит для включения менеджеров в структуру наследства продаж билетов. Поэтому служба продажи билетов является интерфейсом. 1.2 Как использовать интерфейсы в Delphi | | 1.2.1 Объявление интерфейса imyInterface = interface ( iiInterface ) // ;Функция _release: Integer ; End ; объяснение (1): Если существует продолжающаяся связь, заполните родительский интерфейс в скобках, иначе сохраните его, например: imyinterface = интерфейс. ПРИМЕЧАНИЕ (2): Этот GUID не является обязательным. Средство выполнения, такое как определение метода интерфейса. Примечание (3): интерфейс должен реализовать эти три функции. 1.2.2 Службы реализации интерфейса интерфейса реализованы классами. Tintfclass = class (tobject, imyinterface) privatefcounter: integer; freefcount: Integer; publicfunction QueryInterface (const iid: tguid; out obj): hresult; Например: var aintf: imyinterface; beginaobj: = tintfclass.create; tryaintf: = (imyinterface (aobj); ... b. Используйте встроенный механизм компилятора Delphi. Например: aintf: = aobj.c. Используйте метод QueryInterface. Интерфейс должен быть явно указан из iInterface. Интерфейс наследует. Delphi проверит сам интерфейс, если код выпуска не будет выпущено после использования, и добавлена сгенерированная программа , но это также вызывает проблемы, такие как следующий код: var i: integer; = Tintfclass.create ; NIL устанавливается на интерфейс, и Freeandnil (AOBJ) снова выпустит AINT, и объект был выпущен, когда AINTF NIL Вам нужно только уменьшить количество ссылок без выпуска действия. Делегирование объекта класса реализует интерфейс: timplclass = class (tobject, iimplintface) private freefcount: integer; public function converttousd (const intd: integer): двойной; начинать, если GetInterface (iid, obj). Теперь есть еще один класс TintfServiceClass для реализации интерфейса Iimplintface, нет необходимости переопределить его. с помощью объекта PublicConder делегирован с объектом. End; Реализация следующая: конструктор TintfServiceClass.create; . Create; End; Destructor tintfserviceclass.destroy; Указатель GOG интерфейса определяется при смещении VMT -72 в интерфейсе и rttidelphi: vmtintftable = -72. Связанная функция: GetInterfacecount; GetInterfacetable; Связанная структура: tinterfaceEntry = упакованная запись: tguid; vtable: pointer; ioffset: integer; Implgetter: Integer; end; pinterfacetable = ^tinterfacetable; tinterfacetable = упакованный recordentrycount: integer; natures: array [0..9999] из tinterfaceentry; end; Self- это указатель на указатель VMT, так: self.getInterfacetable.EntryCount эквивалентно: aptr: = ppointer (Integeer ((Pointer (self))^) + vmtintftable)^; Инструкция в объявлении, информация RTTI может быть добавлена в программу, скомпилированную в Delphi, такую как: {$ m+} iinvokable = interface (iiInterface) {$ m-} Информация RTTI интерфейса определяется структурой TintfMetAdata: tintfMeadata = RecordName: String; Информация о интерфейсе: ptypeinfo; // Описание информации о интерфейсе ancinfo: ptypeinfo; // Описание родительской информации Numanc: Integer; // Количество методов, унаследованных от конца интерфейса родителей; , CCPASCAL, CCSTDCALL, CCSAFECALL); PtypeInfo; // Опишите указатель информации о методе типа Back-Pass SelfInfo: ptypeinfo; // Указатель информации, описывающий сам метод Парамы: TintfParamentRyArray; // Динамический массив, описывающий информацию о параметрах hasrtti: boolean; // Do Dise имеет логический Значение информации о RTTI; Формат Формата Конец Информации типа; |
|