Memahami Pembantu Kelas Delphi (dan Rekam) memperkenalkan fitur bahasa Delphi yang memungkinkan Anda untuk memperluas definisi kelas atau tipe rekaman dengan menambahkan fungsi dan prosedur (metode) ke kelas dan catatan yang ada tanpa warisan.
Dalam versi Delphi XE3, catatan pembantu menjadi lebih kuat dengan memungkinkan untuk memperluas jenis Delphi sederhana seperti string, integer, enum, set dan sama.
Sistem. Unit SysUtils, dari Delphi XE3, mengimplementasikan catatan bernama "TStringHelper" yang sebenarnya merupakan catatan pembantu untuk string.
Menggunakan Delphi XE3 Anda dapat mengkompilasi dan menggunakan kode berikutnya:
var
s: string; mulai
s: = 'Delphi XE3'; s. Ganti ('XE3', 'aturan', []) .UpUp; akhir;
Agar hal ini dimungkinkan, konstruk baru dibuat dalam Delphi "record helper for [simple type]". Untuk string, ini adalah "ketik TStringHelper = record helper for string". Nama menyatakan "catatan pembantu" tetapi ini bukan tentang memperpanjang catatan - agak tentang memperluas tipe sederhana seperti string, integer dan sama.
Dalam Sistem dan Sistem. SysUtils ada pembantu rekaman yang telah ditentukan sebelumnya untuk tipe sederhana, termasuk: TSingleHelper, TDoubleHelper, TExtendedHelper, TGuidHelper (dan beberapa lainnya). Anda dapat memperoleh dari nama jenis sederhana apa yang ditolong oleh pembantu.
Ada juga beberapa pembantu open source yang berguna, seperti TDateTimeHelper.
Pencacahan? Pembantu Pencacahan?
Enumerasi dan set yang diperlakukan sebagai tipe sederhana juga dapat sekarang (di XE3 dan seterusnya) diperluas dengan fungsionalitas tipe record dapat memiliki: fungsi, prosedur dan sama.
Inilah enumerasi sederhana ("TDay") dan catatan pembantu:
Tipe
TDay = (Senin = 0, Selasa, Rabu, Kamis, Jumat, Sabtu, Minggu); TDayHelper = rekam pembantu untuk TDay. fungsi AsByte: byte; fungsi ToString: tali; akhir;
fungsi TDayHelper. AsByte: byte; mulai
hasil: = Byte (sendiri); akhir; fungsi TDayHelper. ToString: tali; mulaikasus diri dari
Senin: hasil: = 'Senin'; Selasa: hasil: = 'Selasa'; Rabu: hasil: = 'Rabu'; Kamis: hasil: = 'Kamis'; Jumat: hasil: = 'Jumat'; Sabtu: hasil: = 'Sabtu'; Minggu: hasil: = 'Minggu'; akhir; akhir;
var
aDay: TDay; s: string; mulai
aDay: = TDay. Senin; s: = aDay. ToString. ToLower; akhir;
Set? Helper untuk Set?
TDays = set dari TDay;
var
hari: TDays; s: string; mulai
hari: = [Senin.. Rabu]; hari: = hari + [Minggu]; akhir;
TETAPI, betapa HEBAT untuk dapat melakukannya:
var
hari: TDays; b: boolean; mulaihari: = [Senin, Selasa] b: = hari. Intersect ([Senin, Kamis]). IsEmpty;
Tipe
TDaysHelper = rekam pembantu untuk TDays. fungsi Memotong(const hari: TDays): TDays; fungsi IsEmpty: boolean; akhir;... fungsi TDaysHelper. Memotong(const hari: TDays): TDays; mulai
hasil: = mandiri * hari; akhir; fungsi TDaysHelper. IsEmpty: boolean; mulai
hasil: = diri = []; akhir;
Untuk setiap tipe set yang dibangun di sekitar enumerasi, Anda perlu memiliki helper terpisah karena, sayangnya, enumerasi dan set tidak sesuai generik dan tipe generik.
Ini berarti bahwa yang berikut ini tidak dapat dikompilasi:
// TIDAK ADA SESUATU YANG SAMA!
TGenericSet = set ;
Rekam Helper Untuk Set Of Byte!
Tipe
TByteSet = set dari Byte; TByteSetHelper = rekam pembantu untuk TByteSet.
Kita dapat memiliki yang berikut dalam definisi TByteSetHelper:
publikprosedur Bersih; prosedur Termasuk (const nilai: Byte); kelebihan beban; Di barisan; prosedur Termasuk (const nilai: TByteSet); kelebihan beban; Di barisan; prosedur Mengecualikan(const nilai: Byte); kelebihan beban; Di barisan; prosedur Mengecualikan(const nilai: TByteSet); kelebihan beban; Di barisan; fungsi Memotong(const nilai: TByteSet): TByteSet; Di barisan; fungsi IsEmpty: boolean; Di barisan; fungsi Termasuk (const nilai: Byte): boolean; kelebihan; Di barisan;fungsi Termasuk (const nilai: TByteSet): boolean; kelebihan; Di barisan;fungsi IsSuperSet (const nilai: TByteSet): boolean; Di barisan; fungsi IsSubSet (const nilai: TByteSet): boolean; Di barisan; fungsi Sama dengan (const nilai: TByteSet): boolean; Di barisan; fungsi ToString: tali; Di barisan; akhir;
{TByteSetHelper}prosedur TByteSetHelper. Sertakan (nilai const: Byte); mulai
Sistem. Sertakan (diri, nilai); akhir; prosedur TByteSetHelper. Kecualikan (nilai const: Byte); mulai
Sistem. Kecualikan (diri sendiri, nilai); akhir; prosedur TByteSetHelper. Bersih; mulai
diri: = []; akhir; fungsi TByteSetHelper. Sama dengan (nilai const: TByteSet): boolean; mulai
hasil: = diri = nilai; akhir; prosedur TByteSetHelper. Kecualikan (nilai const: TByteSet); mulai
diri: = nilai diri; akhir; prosedur TByteSetHelper. Sertakan (nilai const: TByteSet); mulai
self: = nilai self +; akhir; fungsi TByteSetHelper. Termasuk (nilai const: TByteSet): boolean; mulai
hasil: = IsSuperSet (nilai); akhir; fungsi TByteSetHelper. Persimpangan (nilai const: TByteSet): TByteSet; mulai
hasil: = nilai self *; akhir; fungsi TByteSetHelper. Termasuk (nilai const: Byte): boolean; mulai
hasil: = nilai dalam diri; akhir; fungsi TByteSetHelper. IsEmpty: boolean; mulai
hasil: = diri = []; akhir; fungsi TByteSetHelper. IsSubSet (nilai const: TByteSet): boolean; mulai
hasil: = diri <= nilai; akhir; fungsi TByteSetHelper. IsSuperSet (nilai const: TByteSet): boolean; mulai
hasil: = mandiri> = nilai; akhir; fungsi TByteSetHelper. ToString: string; var
b: Byte; mulaiuntuk b di diri melakukan
hasil: = hasil + IntToStr (b) + ','; hasil: = Salin (hasil, 1, -2 + Panjang (hasil)); akhir;
var
daysAsByteSet: TByteSet; mulai
daysAsByteSet. Bersih; daysAsByteSet. Termasuk (Senin. AsByte); daysAsByteSet. Sertakan (Integer (Sabtu); daysAsByteSet. Termasuk (Byte (TDay. Selasa)); daysAsByteSet. Sertakan (Integer (TDay. Rabu)); daysAsByteSet. Sertakan (Integer (TDay. Rabu)); // waktu ke-2 - tidak masuk akal. daysAsByteSet. Kecualikan (TDay. Selasa. AsByte); ShowMessage (daysAsByteSet. ToString); ShowMessage (BoolToStr (daysAsByteSet. IsSuperSet ([Senin. AsByte, Sabtu. AsByte]), true)); akhir;
Ada tapi :(
Perhatikan bahwa TByteSet menerima nilai byte - dan nilai tersebut akan diterima di sini. TByteSetHelper seperti yang diterapkan di atas bukanlah jenis penghitungan yang ketat (mis. Anda dapat memberinya nilai non TDay)... tapi selama aku sadar.. ini bekerja untuk saya.