Riwayat pembaruan: No.1
Waktu pembaruan: 01-11-2001 20:09
Diperbarui oleh: Musicwind®
Catatan pembaruan: Draf pertama selesai.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~~~~~~~
ringkasan:
Artikel ini membahas cara mengekspor kelas dalam Dll - banyak subkelas berdasarkan kelas abstrak tertentu. Teknologi ini menggunakan ide polimorfisme, memungkinkan kita mendapatkan efek yang mirip dengan plug-in.
Pembaca yang dituju:
Memahami konsep polimorfisme; memahami konsep metaclass.
Kesulitan teknis:
6/10 .
Untuk mengekspor kelas dari Dll, hal pertama yang harus Anda pikirkan adalah menggunakan paket bpl. Salah satu kelemahan metode ini adalah pengguna harus mengetahui kelas mana yang terdapat dalam paket, yang berarti nama kelas tersebut harus diketahui - ini merupakan batasan dalam arti tertentu. Bayangkan situasi di mana pengguna mendefinisikan lapisan bawah kelas abstrak, dan kemudian banyak kelas aplikasi (beton class), kemudian bagi pengguna, ia berharap dapat menggunakan kelas-kelas tersebut tanpa mengetahui kelas spesifiknya - sepertinya agak misterius untuk mengatakan ini, namun keadaan sebenarnya memang demikian, karena tidak dapat diprediksi saat mendefinisikan abstrak kelas Berapa banyak kelas spesifik yang akan ada di masa depan? Jadi, teknologi seperti apa yang dibutuhkan untuk mewujudkan permintaan tersebut?
Faktanya, kesulitan teknis dalam penerapannya tidak terlalu sulit - penulis di sini mendedikasikan pengalaman praktisnya untuk semua orang, sebagai cara untuk menarik ide-ide baru, dan berharap untuk melihat metode lain yang lebih baik!
Berikut ini pertama-tama perkenalkan beberapa pengetahuan dasar yang terlibat dalam metode ini, dan kemudian gunakan contoh untuk mengilustrasikan implementasi spesifiknya.
1. Konsep dasar
Kelas meta (meta class), disebut juga tipe referensi kelas (class-reference type), dapat dianggap sebagai tipe kelas, dan nilai variabel yang dideklarasikan dengan tipe ini mewakili sebuah kelas. Misalnya:
jenis
TClass = Kelas TObject;
Ini mendeklarasikan tipe metaclass. Kemudian Anda dapat memiliki deklarasi variabel seperti ini:
Var
Kelas A: Kelas T;
Kemudian, Anda bisa menggunakannya seperti ini:
Kelas A := TObjek;
atau:
Kelas A := Tombol T;
atau:
Kelas A := TForm;
dll.
Karena TClass adalah metaclass bertipe TObject, dan TButton, TForm, dll. semuanya diturunkan dari TObject, nilai seperti TButton dan TForm dapat diterima oleh AClass.
Kemudian kita dapat menggunakan ide polimorfisme dan secara fleksibel menggunakan variabel kelas AClass. Ini juga merupakan pengetahuan dasar untuk implementasi spesifik di bawah ini.
2. Implementasi yang spesifik
Langkah pertama adalah membuat kelas abstrak:
Kami menggunakan deklarasi sederhana seperti itu. Kelas abstrak hanya menyediakan metode abstrak, tetapi tidak mempengaruhi deskripsi masalah kami:
TMyBaseForm = Kelas(TForm)
Terlindung
fungsi DapatkanJudul: pchar;
akhir;
MyBaseFormClass = Kelas TMyBaseForm;
Mari kita tidak membahas berapa banyak metode praktis dan antarmuka yang disediakan oleh kelas abstrak tersebut, karena yang ingin kita diskusikan adalah kelayakan teknis. Asumsikan bahwa niat awal penulis dalam mendefinisikan antarmuka ini adalah untuk mendapatkan sejumlah Judul yang berubah, dan nilai pengembalian spesifik GetTitle perlu diimplementasikan oleh subkelas. Selain itu, penulis juga berharap agar kode subclass dapat diimplementasikan dalam Dll dan dipisahkan dari program utama - metode ini memiliki rasa plug-in, dan mungkin juga dapat mewujudkan beberapa fitur Plug&Play - cukup bukan menarik? Jadi apa yang harus Anda lakukan selanjutnya?
Pertama, program utama dan program Dll harus mencakup unit yang disebutkan di atas. Kemudian, program utama bertanggung jawab untuk mengimplementasikan driver - memuat Dll secara dinamis dan memuat kelas secara dinamis dan Dll bertanggung jawab untuk mengimplementasikan subkelas.
Mari kita bicara tentang Dll dulu.
Langkah kedua adalah mengekspor subkelas di Dll :
Kami merancang dua fungsi ekspor berikut:
1. fungsi GetClassCount: bilangan bulat;
Beritahukan kepada penelepon bahwa ada beberapa subclass di Dll ini;
2. fungsi GetClassTypeByIndex(const iIndex: integer;
var ClassType: MyBaseFormClass): WordBool;
Dapatkan subkelas tertentu berdasarkan indeks. Perhatikan bahwa tipe ClassType di sini adalah MyBaseFormClass, yang menunjukkan bahwa nilainya akan menjadi kelas pasti yang diwarisi dari TMyBaseForm.
Berikut adalah salah satu kemungkinan penerapannya:
fungsi GetClassCount: bilangan bulat;
mulai
hasil := 3; //Menunjukkan bahwa 3 kelas diekspor dalam Dll ini
akhir;
fungsi GetClassTypeByIndex(const iIndex: integer;
var ClassType: MyBaseFormClass): WordBool;
mulai
hasil := Benar;
kasus iIndeks dari
0: Tipe Kelas := TFrmTest1;
1: Tipe Kelas := TFrmTest2;
2: Tipe Kelas := TFrmTest3;
kalau tidak
hasil := Salah;
akhir;
akhir;
Tentu saja, unit dimana TFrmTest1, TFrmTest2 dan TFrmTest3 berada harus dimasukkan dalam daftar Penggunaan unit tersebut. Implementasi TFrmTest1 bisa seperti ini:
TFrmTest1 = Kelas(TMyBaseForm)
terlindung
fungsi GetTitle: penggantian PChar;
akhir;
fungsi TFrmTest1.GetTitle: Pchar;
mulai
hasil := 'Halo dari TFrmTest1';
akhir;
Terakhir, jangan lupa untuk menambahkan GetClassCount dan GetClassByIndex ke daftar Ekspor. Kemudian, ketika membangun proyek Dll, silakan centang "gunakan paket runtime" di paket opsi Proyek. Alasan spesifiknya akan dibahas nanti.
Pada titik ini, pengerjaan Dll telah berakhir.
Langkah ketiga adalah implementasi program utama driver engine:
Langkah ini relatif mudah - tidak lebih dari memuat Dll secara dinamis, lalu memanggil fungsi GetClassCount, lalu memanggil GetClassByIndex. Kode kunci:
Var AClass: TMyBaseClass;
Formulir: TMyBaseForm;
Saya, iCount: bilangan bulat;
blHasil: Boolean;
mulai
//Abaikan bagian tentang memuat perpustakaan dinamis, dengan asumsi bahwa FPGetClassProc menunjuk ke fungsi GetClassCount dan FPGetClassByIndexProc menunjuk ke GetClassByIndex, lalu:
iCount := FPGetClassProc;
untuk I := 0 hingga iCount ?C 1 lakukan
mulai
AClass := FPGetClassByIndex(I, blHasil);
jika blHasil maka
mulai
AForm := AClass.Create(aplikasi);
AForm.Caption := AForm.GetTitle;
AForm.Tampilkan;
akhir;
akhir;
//…
akhir;
Perhatikan bahwa, mirip dengan Dll, Anda juga harus memilih untuk menggunakan paket runtime saat membuat file keluaran. Hal ini karena tidak menggunakan paket runtime akan menghasilkan banyak salinan dari kelas yang sama di memori, jadi menggunakan operator Is pada paket tersebut akan mengembalikan hasil yang Salah.
Musicwind®@HangZhou.Zhejiang.China
2001-11-01
Lebih banyak artikel
[ Akhir artikel]