Semua class di dalam Delphi adalah turunan dari TObject. Jadi definisi tipe class seperti
TGambar=class
Memiliki arti yang sama dengan
TGambar=class(TObject)
Constructor dan destructor
Constructor adalah method khusus yang berguna untuk pembuatan obyek. Biasanya constructor diberi nama Create. Pembuatan obyek yang sudah biasa kita lakukan adalah pemanggilan terhadap constructor yang telah didefinisikan di dalam TObject. Dengan demikian setiap class akan mempunyai method Create.
Destructor adalah kebalikan dari constructor. Destructor adalah method khusus yang dipanggil untuk membuang obyek. Saat kita memanggil method Free, maka destructor akan dipanggil. Destructor biasanya diberi nama Destroy.
Seperti pada method-method lain, constructor dan destructor juga bisa dibuat supaya memiliki implementasi yang berbeda dengan leluhurnya. Destroy bersifat virtual. Jadi Anda harus menambahkan override jika akan membuat Destroy pada class buatan Anda. Sedangkan Create bersifat static (tanpa virtual). Jadi jika Anda membuat class turunan langsung dari TObject, maka Anda tidak bisa menambahkan override untuk Create yang Anda definisikan sendiri. Akan tetapi pada class-class dibawahnya, banyak yang telah menerapkan Create sebagai virtual. Jadi untuk membuat turunan dari class selain TObject Anda perlu mencoba untuk menambahkan override pada Create yang Anda buat. Jika Create pada class tersebut ternyata static, maka akan muncul pesan kesalahan pada penambahan override tersebut.
Cara membuat constructor dan destructor
Membuat constructor dan destructor pada dasarnya sama dengan membuat prosedur biasa. Perbedaannya hanya terletak pada penggantian kata procedure menjadi constructor atau destructor.
Pada constructor, yang dilakukan pertama kali biasanya adalah memanggil constructor milik leluhurnya, baru melakukan proses-proses lain yang dibutuhkan. Untuk memanggil method yang diwariskan oleh leluhur, kita menggunakan kata inherited di depan nama method yang dipanggil. Jadi, biasanya Create akan terlihat misalnya seperti:
constructor TLingkaran.Create; begin inherited Create; ..... end;
Pada destructor, pemanggilan terhadap destructor leluhurnya biasanya dilakukan pada beris terakhir sebelum end. Contohnya seperti:
destructor TLingkaran.Destroy; begin ..... inherited Destroy; end;
Tujuan pembuatan constructor dan destructor
Constructor dibuat untuk membuat inisialisasi terhadap obyek. Sering kali kita membutuhkan agar sebuah obyek yang dibuat memiliki nilai-nilai tertentu pada beberapa fieldnya. Pemberian nilai awal ini bisa dilakukan di dalam constructor. Jika class yang kita buat tersusun dari obyek-obyek lain, maka obyek-obyek tersebut harus dibuat sebelum bisa digunakan. Ingat bahwa class selalu bertipe pointer sehingga deklarasi obyek tidak serta-merta membuat obyeknya. Pembuatan obyek-obyek ini bisa dilakukan di dalam constructor.
Jika class Anda membuat obyek-obyek lain, maka class Anda juga bertanggung jawab membuang obyek-obyek tersebut saat class Anda akan dibuang. Pembuangan obyek-obyek tersebut bisa dilakukan di dalam destructor.
Contoh program dengan constructor dan destructor
program Turunan4; {$APPTYPE CONSOLE} type TPoint=record X,Y:integer; end; TGambar=class(TObject) Posisi:TPoint; procedure GambarObyek;virtual;abstract; end; TLingkaran=class(TGambar) Jari2:integer; constructor Create; destructor Destroy;override; procedure GambarObyek;override; end; TKotak=class(TGambar) Panjang:integer; Lebar:integer; constructor Create; destructor Destroy;override; procedure GambarObyek;override; end; constructor TLingkaran.Create; begin inherited Create; Write('Tentukan jari-jari: '); Readln(Jari2); end; destructor TLingkaran.Destroy; begin Writeln('Lingkaran dihapus...'); inherited Destroy; end; procedure TLingkaran.GambarObyek; begin Writeln('Menggambar lingkaran dengan '); Writeln(' jari-jari ',Jari2); end; constructor TKotak.Create; begin inherited Create; Write('Tentukan panjang: '); Readln(Panjang); Write('Tentukan lebar: '); Readln(Lebar); end; destructor TKotak.Destroy; begin Writeln('Kotak dihapus...'); inherited Destroy; end; procedure TKotak.GambarObyek; begin Writeln('Menggambar kotak dengan'); Writeln(' panjang ',Panjang,' dan'); Writeln(' lebar ',Lebar); end; var Gambar:TGambar; Pilihan:Char; begin repeat Writeln(#13#10'Tentukan pilihan'); Writeln('1:Lingkaran'); Writeln('2:Kotak'); Writeln('3:Selesai'); Write('Pilihan Anda: '); Readln(Pilihan); Writeln; //membuat obyek case Pilihan of '1':Gambar:=TLingkaran.Create; '2':Gambar:=TKotak.Create; '3':Break; else continue; end; //memanggil method Gambar.GambarObyek; //membuang obyek Gambar.Free; until False; end.
Jika program dijalankan, hasilnya akan tampak seperti:
C:\Source>Turunan4 Tentukan pilihan 1:Lingkaran 2:Kotak 3:Selesai Pilihan Anda: 1 Tentukan jari-jari: 16 Menggambar lingkaran dengan jari-jari 16 Lingkaran dihapus... Tentukan pilihan 1:Lingkaran 2:Kotak 3:Selesai Pilihan Anda: 2 Tentukan panjang: 16 Tentukan lebar: 8 Menggambar kotak dengan panjang 16 dan lebar 8 Kotak dihapus... Tentukan pilihan 1:Lingkaran 2:Kotak 3:Selesai Pilihan Anda: 3 C:\Source>