| 1.1 Mengapa menggunakan antarmuka? Misalnya: ada layanan penjualan tiket seperti itu, bioskop dapat menjual tiket, rumah opera dapat menjual tiket, dan stasiun penumpang juga dapat menjual tiket. Layanan Penjualan Tiket? Anda harus tahu bahwa bahkan manajer dapat menjual tiket, yang jelas tidak cocok untuk memasukkan manajer dalam struktur warisan layanan penjualan tiket. Oleh karena itu, layanan penjualan tiket adalah antarmuka. 1.2 Cara Menggunakan Antarmuka di Delphi | | 1.2.1 Deklarasikan antarmuka imyInterface = antarmuka (iiinterface) // instruksi (1) ['{63E072DF-B81E-4734-B3CB-3C23C7FDA8A}'] // Fungsi getName ( const str: string): string ; ;Fungsi _Release: Integer ; Akhir ; Penjelasan (1): Jika ada hubungan yang berkelanjutan, isi antarmuka induk dalam tanda kurung, jika tidak, simpan, seperti: imyinterface = antarmuka. Catatan (2): Guid ini opsional. runtime, seperti definisi metode antarmuka. Catatan (3): Antarmuka harus mengimplementasikan ketiga fungsi ini. 1.2.2 Layanan Antarmuka Implementasi Antarmuka diimplementasikan oleh Kelas. TintfClass = Class (Tobject, ImyInterface) PrivateFcounter: Integer; Frefcount: Integer; PublicFunction QueryInterface (Const IID: TGUID; Out OBJ): HRESULT; Sebagai contoh: var aintf: imyinterface; bekas: = tintfclass.create; triaintf: = (imyinterface (aobj); ... b. Gunakan mekanisme bawaan kompiler Delphi. Misalnya: aintf: = aobj.c. Gunakan Metode QueryInterface dari Object. Antarmuka harus ditentukan secara eksplisit dari iinterface yang diwariskan antarmuka. Delphi akan memeriksa antarmuka itu sendiri jika kode rilis tidak dirilis setelah digunakan dan program yang dihasilkan ditambahkan, tetapi ini juga menyebabkan masalah, seperti kode berikut: var i: integer; = Tintfclass.create ; NIL diatur ke antarmuka, dan FreeAndnil (AOBJ) akan merilis Aintf lagi, dan objek telah dirilis ketika Aintf adalah nol , Anda hanya perlu mengurangi jumlah referensi tanpa pelepasan. Delegasi Objek Kelas mengimplementasikan antarmuka: TimplClass = class (tobject, iImplInterface) Private FREFCount: Integer; Public Function ConvertTousd (Const Intd: Integer): Double; ... Akhir; Fungsi Implementasi TemplClass.QueryInterface (Const IID: TGUID; Out OBJ): HRESULT; Mulailah jika getInterface (IID, OBJ) maka hasilnya: = 0 Hasil lain: = e_nointerface; end; function timpclass._release: integer; Sekarang ada kelas lain TintfServiceCeClass untuk mengimplementasikan antarmuka iImplIterface, tidak perlu mendefinisikannya kembali. dengan objek Kelas PublicConstructor ; didelegasikan dengan suatu objek. END; Implementasi adalah sebagai berikut: konstruktor tintfserviceClass.create; .Buat; akhir; TintfserviceClass.destroy TintfserviceClass.Destroy; Pointer antarmuka GOG didefinisikan pada perpindahan VMT -72 di antarmuka dan rttidelphi: vmtintftable = -72. Fungsi Terkait: GetInterfacecount; // Dapatkan jumlah antarmuka. GetInterfacetable; // Dapatkan tabel antarmuka. Struktur terkait: tinterfaceEntry = recordiid dikemas: tguid; vtable: pointer; ioffset: integer; implgetter: integer; end; pinterfacetable = ^tinterfacetable; tinterfacetable = recordEntrycount yang dikemas: integer; entri: array [0..9999] dari Tinterentrycount: Integer; Entries: Array [0..999] dari TinterTryRy; Self adalah pointer ke vmt pointer, jadi: self.getInterfacetable.entrycount setara dengan: aptr: = ppointer (integeer ((pointer (self))^) + vmtintftable)^selama Anda menggunakan m +/m- Instruksi dalam Deklarasi, Informasi RTTI dapat ditambahkan ke program yang dikompilasi dalam Delphi, seperti: {$ M+} iinvokable = antarmuka (IIinterface) {$ m-} Informasi RTTI dari antarmuka ditentukan oleh TintfMetadata Struktur: TintfMetadata = RecordName: String; // Antarmuka Nama UnitName: String; // Nama Unit Program yang dideklarasikan oleh antarmuka MDA: TintfMethENTRYArray; // Nilai Guid IID yang menyimpan informasi metode di antarmuka: tguid; Info Antarmuka: PtypeInfo; // Pointer Menggambarkan Informasi Antarmuka Ancinfo: PtypeInfo; // Pointer Menggambarkan Informasi Induk Numanc: Integer; // Jumlah metode yang diwarisi dari akhir antarmuka induk; , CCPASCAL, CCSTDCALL, CCSAFECALL); PtypeInfo; // Jelaskan pointer informasi dari metode back-pass type selfinfo: ptypeInfo; // pointer informasi yang menggambarkan metode itu sendiri params: tintfparamentryarray; // array dinamis yang menggambarkan informasi parameter hasrtti: boolean; // apakah metode ini memiliki boolean. Nilai akhir dari informasi RTTI; Format stand akhir informasi jenis; |
|