Di Delphi, "antarmuka" memiliki dua arti berbeda. Di OOP jargon, Anda dapat menganggap antarmuka sebagai kelas tanpa implementasi. Dalam bagian antarmuka definisi unit Delphi digunakan untuk mendeklarasikan setiap bagian publik dari kode yang muncul dalam suatu unit. Artikel ini akan menjelaskan antarmuka dari perspektif OOP.
Jika Anda ingin membuat aplikasi rock-solid sehingga kode Anda dapat dipelihara, digunakan kembali, dan fleksibel OOP sifat Delphi akan membantu Anda mengarahkan 70% pertama dari rute Anda. Mendefinisikan antarmuka dan mengimplementasikannya akan membantu dengan 30% sisanya.
Kelas Abstrak
Anda dapat menganggap sebuah antarmuka sebagai kelas abstrak dengan semua implementasi dilucuti dan segala sesuatu yang tidak dihapus publik. Kelas abstrak di Delphi adalah kelas yang tidak bisa dipakai - Anda tidak bisa membuat objek dari kelas yang ditandai sebagai abstrak.
Mari kita lihat contoh deklarasi antarmuka:
Tipe
IConfigChanged = antarmuka['{0D57624C-CDDE-458B-A36C-436AE465B477}']
prosedur TerapkanConfigChange;
akhir;
Itu IConfigChanged adalah sebuah antarmuka. Antarmuka didefinisikan seperti kelas, kata kunci "antarmuka" digunakan sebagai ganti "kelas". Nilai panduan yang mengikuti kata kunci antarmuka digunakan oleh kompiler untuk mengidentifikasi antarmuka secara unik. Untuk menghasilkan nilai GUID baru, cukup tekan Ctrl + Shift + G di Delphi IDE. Setiap antarmuka yang Anda tetapkan membutuhkan nilai Panduan yang unik.
Antarmuka dalam OOP mendefinisikan abstraksi — templat untuk kelas aktual yang akan mengimplementasikan antarmuka — yang akan mengimplementasikan metode yang ditentukan oleh antarmuka. Antarmuka sebenarnya tidak melakukan apa-apa, itu hanya memiliki tanda tangan untuk berinteraksi dengan kelas (antarmuka) lain atau antarmuka.
Implementasi metode (fungsi, prosedur, dan metode Get / Set properti) dilakukan di kelas yang mengimplementasikan antarmuka. Dalam definisi antarmuka, tidak ada bagian ruang lingkup (pribadi, publik, diterbitkan, dll.) Semuanya bersifat publik. Tipe antarmuka dapat mendefinisikan fungsi, prosedur (yang pada akhirnya akan menjadi metode kelas yang mengimplementasikan antarmuka) dan properti. Ketika sebuah antarmuka mendefinisikan sebuah properti, ia harus mendefinisikan metode get / set - interface tidak dapat mendefinisikan variabel.
Seperti halnya kelas, sebuah antarmuka dapat mewarisi dari antarmuka lain.
Tipe
IConfigChangedMore = antarmuka(IConfigChanged)
prosedur TerapkanMoreChanges;
akhir;
Pemrograman
Kebanyakan pengembang Delphi ketika mereka memikirkan antarmuka mereka memikirkan pemrograman COM. Namun, antarmuka hanyalah fitur OOP dari bahasa itu - mereka tidak terikat ke COM secara khusus. Antarmuka dapat didefinisikan dan diimplementasikan dalam aplikasi Delphi tanpa menyentuh COM sama sekali.
Penerapan
Untuk mengimplementasikan antarmuka, Anda perlu menambahkan nama antarmuka ke pernyataan kelas, seperti pada:
Tipe
TMainForm = kelas(TForm, IConfigChanged)
publik
prosedur TerapkanConfigChange;
akhir;
Dalam kode di atas formulir Delphi bernama "MainForm" mengimplementasikan antarmuka IConfigChanged.
Peringatan: ketika sebuah kelas mengimplementasikan sebuah antarmuka, ia harus mengimplementasikan semua metode dan propertinya. Jika Anda gagal / lupa menerapkan metode (misalnya: ApplyConfigChange) kesalahan waktu kompilasi "E2003 Undeclared identifier: 'ApplyConfigChange'" akan terjadi.
Peringatan: jika Anda mencoba menentukan antarmuka tanpa nilai GUID Anda akan menerima: "Tipe E2086 'IConfigChanged' belum sepenuhnya didefinisikan".
Contoh
Pertimbangkan aplikasi MDI di mana beberapa formulir dapat ditampilkan kepada pengguna sekaligus. Ketika pengguna mengubah konfigurasi aplikasi, sebagian besar formulir perlu memperbarui tampilannya — tampilkan / sembunyikan beberapa tombol, perbarui keterangan label, dll. Anda akan membutuhkan cara sederhana untuk memberi tahu semua formulir terbuka bahwa perubahan dalam konfigurasi aplikasi telah terjadi. Alat yang ideal untuk pekerjaan itu adalah antarmuka.
Setiap formulir yang perlu diperbarui ketika perubahan konfigurasi akan mengimplementasikan IConfigChanged. Karena layar konfigurasi ditampilkan secara modern, ketika menutup kode berikutnya memastikan semua formulir implementasi IConfigChang diberitahukan dan ApplyConfigChange dipanggil:
prosedur DoConfigChange ();
var
cnt: integer;
icc: IConfigChanged;
mulai
untuk cnt: = 0 untuk -1 + Layar. FormCount melakukan
mulai
jika Mendukung (Layar. Bentuk [cnt], IConfigChanged, icc) kemudian
icc. TerapkanConfigChange;
akhir;
akhir;
Dukungan fungsi (didefinisikan dalam Sysutils.pas) menunjukkan apakah objek atau antarmuka yang diberikan mendukung antarmuka yang ditentukan. Kode ini diputar melalui Layar. Koleksi formulir (objek TScreen) —semua formulir yang saat ini ditampilkan dalam aplikasi. Jika suatu bentuk Layar. Bentuk [cnt] mendukung antarmuka, Mendukung mengembalikan antarmuka untuk parameter parameter terakhir dan mengembalikan true.
Oleh karena itu, jika formulir mengimplementasikan IConfigChanged, variabel icc dapat digunakan untuk memanggil metode antarmuka seperti yang diterapkan oleh formulir. Perhatikan, tentu saja, bahwa setiap formulir dapat memiliki pelaksanaannya sendiri yang berbeda dari prosedur ApplyConfigChange.
Leluhur
Setiap kelas yang Anda definisikan dalam Delphi harus memiliki leluhur. TObject adalah leluhur tertinggi dari semua objek dan komponen. Gagasan di atas berlaku untuk antarmuka juga, IInterface adalah kelas dasar untuk semua antarmuka. IInterface mendefinisikan 3 metode: QueryInterface, _AddRef dan _Release.
Ini berarti bahwa IConfigChanged kami juga memiliki 3 metode tersebut, tetapi kami belum menerapkannya. Ini karena TForm mewarisi dari TComponent yang sudah mengimplementasikan IInterface untuk Anda! Saat Anda ingin mengimplementasikan antarmuka di kelas yang mewarisi dari TObject, pastikan kelas Anda mewarisi dari TInterfacedObject sebagai gantinya. Karena TInterfacedObject adalah TObject yang mengimplementasikan IInterface. Sebagai contoh:
TMyClass = kelas(TInterfacedObject, IConfigChanged)
prosedur TerapkanConfigChange;
akhir;
Kesimpulannya, IUnknown = IInterface. IUnknown adalah untuk COM.