• Tidak ada hasil yang ditemukan

Kelas TObject dan Variabel bertipe Object

Dalam dokumen DAFTAR ISI - PEMROGRAMAN DELPHI (Halaman 51-58)

2.2. Delphi Object Pascal

2.2.5. Kelas TObject dan Variabel bertipe Object

Kelas TObject adalah kelas yang mempunyai posisi tertinggi dalam struktur hirarki objek dalam Delphi. Semua kelas adalah turunan dari TObject. Ketika kita hanya mendefinisikan sebuah objek tanpa diturunkan dari kelas apa pun, secara otomatis Delphi akan menurunkan kelas ini dari TObject.

type MyClass =class private MyData1: Integer; MyData2: Integer; public

functionGetMyData1: Integer; functionGetMyData2: Integer; functionGetMyData3: Integer; end;

Pada contoh di atas, MyClass tidak diturunkan dari objek apa pun. Secara otomatis kelas MyClass diturunkan dari TObject.

Semua variabel bertipe TObject maupun turunannya, adalah variabel pointer. Oleh sebab itu, sebelum variabel tersebut dapat dipakai harus disiapkan memory untuk objek yang dimaksud dengan cara memanggilconstructor‐ nya(biasanyaconstructorbernamaCreate).

Selain itu, seperti halnya sifat variabelpointer biasa,assignment antara dua variabel pointer tidak akan meng‐copyobjek, tetapi kedua variabel akan menunjuk keinstanceyang sama.

var

Obj1, Obj2: MyClass; begin Obj1 := MyClass.Create; Obj2 := Obj1; Obj1.MyData1 := x; end; 2.2.6. Method

Method adalah function atauprocedure yang dimiliki oleh objek. Method didefinisikan sebagai member dari suatu kelas. Cara pendefinisian dan perilakunya sangat mirip dengan function atauprocedure biasa. Perbedaannya adalah pada bagian implementasi dari method kita harus memberikan qualifier yang merupakan nama kelas. Perhatikan contoh definisi objek berikut ini.

TMyObject =class public

procedureMyProc(x: Integer);

functionMyFunc(X : Double); Double; end;

Kedua methodyang mempunyai TMyObject harus kita implementasikan seperti pada contoh berikut ini. functionTMyObject.MyFunc(X: Double): Double;

result := X; end;

procedureTMyObject.MyProc(x: Integer); begin

// do something end;

Cara menggunakannya dapat dilakukan seperti contoh berikut ini. Y := X.MyFunc(10);

Pada contoh di atas, X adalahinstancedari TMyObject. Constructor dan Destructor

Constructor dan destructor adalah method khusus dari objek yang akan dipanggil untuk membangun objek (constructor) dan menghancurkan objek (destructor). Meskipun tidak harus, sebaiknya nama constructoradalahcreatedan namadestructoradalahdestroy.

Abstract Method dan Abstract Class

Abstract method adalah method yang tidak mempunyai implementasi. Abstract class adalah kelas yang mempunyai paling tidak satu abstract method. Abstract class murni adalah kelas yang seluruh method‐ nya abstrak dan tidak mempunyai definisifield.

Untuk mendefinisikanabstract classdalam Delphi, kita tinggal menambahkan kata kunciabstract. Tetapi abstract methodharus bersifat virtual, sehingga sebelum kita nyatakan sebagaiabstract,sebuahmethod harus dinyatakan sebagai virtual terlebih dahulu seperti contoh di bawah ini.

TMyObject =class public

functionMyAbstFunc(X: Double) : Double;virtual; abstract; end;

Class Method

Bila method biasa hanya dapat dipanggil dari instance object, class method adalah method yang dapat dipanggil langsung dari tipe kelasnya (tanpa perlu createobjek). Cara mendefinisikannya adalah dengan menambahkan kata kunci class di depan method yang kita definisikan. Cara menggunakannya adalah dengan memanggil nama kelas diikuti namaclass method‐ nya. Berikut ini adalah contoh penggunaannya.

TMyObject =class public

class functionTest :string; end;

Adapun implementasi dariclass methoddi atas terlihat dalam contoh di bawah ini. class functionTMyObject.Test : string;

begin

result := ClassName; end;

Sedangkan cara menggunakannya sebagai berikut ini. procedureTForm1.ButtonClick(Sender : TObject); begin

ShowMessage(TMyObject.Test); end;

Dalamclass methodkita dapat memanggilconstructorataupunclass methodlain. Namun kita tidak dapat mengaksesfield,property, danmethodbiasa.

2.2.7. Encapsulation

Encapsulation adalah menyembunyikan bagian internal program sehingga secara alamiah tidak menjadi perhatian bagi pengguna objek tersebut.

Bagian objek yang dapat dikenali oleh pihak luar biasanya adalah bagian publik, sedangkan bagian yang disembunyikan adalah bagian private. Delphi menyediakan 3 (tiga) buah direktif yang berkaitan dengan information hiding, yaitu private, protected, dan public. Selain itu, di tingkat yang setara, Delphi menyediakan direktifpublisheduntuk RTTI.

Gambar 3‐ 1. Encapsulation Private

Direktif ini digunakan untuk mendefinisikan objek member (field, property, dan method) yang bersifat internal. Bila sebuah objek member bersifat private maka member ini hanya bisa diakses dari unit yang sama.

Public

Bila suatu objek member diinginkan agar dapat diakses dari unit lain, maka member ini harus didefinisikan sebagaipublic.

Protected

Protectedberada di antaraprivatedanpublic. Setiapmemberyang didefinisikan sebagai protecteddapat diakses oleh modul manapun bila berada di unit yang sama (serupa dengan private). Tetapi protected memberhanya dapat diakses oleh turunan objek bila berada di unit yang terpisah.

Published

Direktif published digunakan untuk mendefinisikan bahwa property atau method akan mempunyai RTTI (run‐ time type information). Visibility‐ nya sama dengan public, yang berarti member yang bersifat published dapat diakses dari unit lain. Adapun RTTI menyebabkan property bisa muncul di Object Inspector.Propertyataumethodbisa berada pada bagianpublished. Tetapi hanyafieldyang bertipe kelas atauinterfacesaja yang dapat berada di bawahpublished.

2.2.7.1. Event

Dalam Delphi, event adalah property yang bertipe method dan mempunyai visibility published. Karena mempunyai visibility published, event mempunyai RTTI sehingga dapat muncul di Object Inspector. Sebagaiproperty, kita dapat meng‐assign eventseperti halnya kita meng‐ assign propertybiasa, tentu saja dengan syarat tipenya kompatibel. Pada saat tertentu sesuai dengan kebutuhan program, property bertipe method ini akan dijalankan setelah diperiksa terlebih dahulu bahwa nilainya tidak nil. Delphi memanfaatkan teknik ini agar perilaku komponen bisa diintervensi oleh Software Engineer sebagaiuser komponen tersebut.

2.2.8. Inheritance

Dalam OOP, konsep inheritancedilakukan dengan generalisasi dan spesialisasi. Semua kemampuan yang dimiliki oleh suatu objek pasti dimiliki oleh turunan dari objek tersebut. Keuntungan penting lain dari adanya inheritance dalam OOP adalah kita bisa menambahkan kemampuan objek yang sudah tersedia tanpa mengubah kode objek tersebut.

Dalam Delphi, setiap kita mendefinisikan objek baru, kita pasti menurunkannya dari objek lain, paling tidak dari TObject. Ini berarti kita sudah melakukan inheritance. Kita bisa melakukannya dengan membuat objek baru yang diturunkan dari objek yang sudah tersedia.

TMyObject =class(TLabel)

end;

Pada contoh di atas, TMyObject adalah turunan dari TLabel. 2.2.9. Polymorphism

Secara luas, polymorphism berarti kode yang sama dapat digunakan untuk kelas atau tipe data yang berbeda dengan hasil yang berbeda sesuai dengan kelas atau data yang ada. Dengan arti yang luas ini, operator tambah (+) juga mempunyai sifat polymorphism, karena dapat bekerja untuk integer, real, maupun string. Demikian juga overloading method, function, atau procedure mempunyai sifat polymorphism. Yang kita bahas di sini adalah polymorphism yang berkaitan dengan inheritance (subclassing), di mana sifat yang sudah terdefinisi pada nenek moyangnya dapat di‐ implementasi oleh objek turunannya dengan cara berbeda.

Misalkan kita mempunyai objek TBentuk yang kita turunkan menjadi TKotak dan TEllipse. Pada objek TBentuk kita definisikan method Gambar. Untuk setiap turunan dari TBentuk, kita akan meng‐ implementasi method Gambar ini secara berbeda sesuai kebutuhan kita. Ketika kita mempunyai sekumpulan objek TBentuk, tanpa peduli objek tersebut adalah TKotak atau TEllipse, kita dapat memanggilmethodGambar yang akan menampilkan hasil yang berbeda. Untuk lebih jelasnya perhatikan

Pertama kita akan mendefinisikan 3 (tiga) buah objek, yaitu TBentuk, TKotak, dan TEllipse. Dalam objek TBentuk kita definisikanmethodGambar yang bersifat virtual.

TBentuk =class private

FBound : TRect; public

constructorCreate(vBound : TRect);

procedureGambar (vCanvas : TCanvas) ;virtual; end;

TKotak = class (TBentuk) public

procedureGambar(vCanvas : TCanvas) ;override; end;

TEllipse = class (TBentuk) public

procedureGambar(vCanvas : TCanvas) ;override; end;

Implementasi untukconstructor createdanmethodGambar dari TBentuk sebagai berikut ini. { TBentuk }

constructorTBentuk.Create(vBound : TRect); begin

FBound := vBound; end;

procedureTBentuk.Gambar(vCanvas : TCanvas); begin

// Tidak melakukan apa-apa end;

Method Gambar dari TBentuk tidak melakukan apa‐ apa, karena bentuk memang tidak bisa digambar. Biasanya yang seperti ini dibuat menjadiabstract method.

Implementasi Gambar untuk TKotak dan TEllipse sebagai berikut ini. { TKotak }

procedureTKotak.Gambar(vCanvas : TCanvas); begin

vCanvas.Rectangle(FBound); end;

{ TEllipse }

procedureTEllipse.Gambar(vCanvas : TCanvas); begin

vCanvas.Ellipse(FBound); end;

Selanjutnya akan kita lihat bagaimana menggunakan TBentuk, TKotak, dan TEllipse. Pertama, kita definisikan sebuaharray ofTBentuk yang bisa kita letakkan di bagianinterface.

var

FArrayBentuk :array ofTBentuk;

Kemudian elemen‐ elemenarray‐ nya kitacreatesebagai TKotak atau TEllipse pada secararandomdengan FBound yang randomjuga. Kita perlu sebuah function yang bisa menghasilkan rectangle random. Untuk meng‐ inisialisasi dan membuangarraykita gunakan masing‐ masing sebuahprocedure.

functionRandomRect(X, Y, W, H : Integer) : TRect; varvX, vY : Integer;

begin

vX := Random(X); vY := Random(Y);

result := Rect(vX, vY, vX+Random(W), vY+Random(H)); end;

procedureInitArray(Count : Integer); vari : Integer;

vRect : TRect; begin

SetLength(FArrayBentuk, Count); fori := 0toCount-1do begin

vRect := RandomRect(400, 500, 10, 20); ifRandom(2) = 1then begin

FArrayBentuk[ i] := TKotak.Create(vRect); end else begin

FArrayBentuk[ i] := TEllipse.Create(vRect); end; end; end; procedureRemoveArray; vari : Integer; begin

for i := 0toLength(FArrayBantuk)-1do begin FArrayBentuk[ i] .Free;

end; end;

Procedure InitArray kita panggil pada bagian Initialization. Pada bagian finalization kita panggil RemoveArray. initialization InitArray; finalization RemoveArray; end.

Berikut ini adalah contoh penting untukpolymorphism‐ nya. fori := 0toLength(FArrayBentuk)-1do begin

Pada potongan kode di atas, elemen FArrayBentuk adalah bertipe TBentuk. Tetapi pada saat di‐create, objek‐ objek TBentuk tersebut bisa berupa TKotak atau TEllipse. Tetapi kode di atas tidak peduli apakah objek actual yang ditunjuk oleh elemen Array adalah TKotak atau TEllipse. Kode di atas masih bisa bekerja tanpa perubahan meskipun kita menurunkan lagi TBentuk menjadi TPolygon, TSegitiga, ataupun yang lainnya.

2.3. Exception

Salah satu hal penting dalam pemrograman adalah menangani error yang mungkin muncul dalam program. Beruntung, Delphi menyediakan pengelolaan error dalam gaya yang konsisten. Ketika sebuah error muncul, maka akan terbentuk secara otomatis sebuah objek dengan tipe exception, dan untuk menghindari kesalahan beruntun yang lebih fatal, alur program tidak akan dilanjutkan. Ide dari kelas exceptionini adalah penanganan terhadaperroryang sederhana dan seragam, sehingga konsentrasi dari Software Engineertidak akan lepas dari objek dan algoritma yang telah tersusun.

Munculnya exception pada aplikasi console menyebabkan aplikasi berhenti. Demikian juga munculnya exception dalam thread akan menyebabkan thread berhenti. Dalam aplikasi GUI biasa, munculnya exception akan menyebabkan tampilnya sebuah Window yang berisi informasi tentang kesalahan yang timbul. Tugas dariSoftware Engineer adalah menulis kode tertentu bilaexceptionterjadi.

Dengan menangani exception secara benar, program akan lebih sehat dan kuat (robust) bahkan pada beberapa kasus dapat membantu menganalisis algoritma untuk menemukanbugdalam algoritma. 2.3.1. Melindungi Alokasi Resource

Bila kita mengalokasikan resource tertentu kita berkewajiban untuk menjamin bahwaresource tersebut kembali bebas setelah tidak kita pergunakan, meskipun terjadi error. Bila kita mengabaikan hal ini, maka perangkat lunak (software) kita menjadi tidak stabil bahkan dapat mengakibatkan operating system menjadi tidak stabil. Untuk melindungi resource yang kita alokasikan, kita dapat menggunakan blok try…finally.

Perhatikan contoh berikut ini.

procedureTForm1.ButtonClick(Sender : TObject); varvPtr : Pointer;

vInteger, vPembagi : Integer; begin

vPembagi := 0;

GetMem(vPtr, 1024);(Alokasi 1 KB Memory)

vInteger := 100divvPembagi;(terjadi exception)

FreeMem(vPtr, 1024); end;

Hal penting yang akan kita pelajari pada contoh di atas adalah ketika terjadi pembagian dengan 0, maka alur program akan loncat keluar dari blok, sehingga FreeMem tidak pernah membuang memory yang telah dialokasikan.

Untuk menjamin bahwa FreeMem dijalankan, kita perlu melindungi alokasi memory dengan menggunakantry…finally, yang bentuk dasarnya sebagai berikut ini.

(alokasi resource)

try

(perintah-perintah yang menggunakan resource tersebut)

finally

( pembebasan resource) end;

(Bila terjadi exception, perintah di sini tidak dijalankan)

Perintah‐ perintah antara finally dan end akan selalu dijalankan, baik terjadi error ataupun tidak. Bila terjadi error pada perintah di antara try dan finally, maka eksekusi program akan terhenti di situ dan loncat ke bagian finallyuntuk menjalankan perintah pembebasan resource. Bila tidak terjadierrormaka setelah semua perintah di antara try … finally dijalankan akan dilanjutkan dengan perintah‐ perintah di antara finally dan end. Sebagai catatan di sini adalah ketika terjadi error, status program setelah selesai menjalankan perintah pembebasan resource adalah masih dalam keadaan error, sehingga perintah‐ perintah setelahendtidak akan dijalankan.

Selanjutnya program di atas kita perbaiki dengan menambahkan perlindungan terhadap alokasiresource sebagai berikut ini.

procedureTForm1.ButtonClick(Sender : TObject); varvPtr : Pointer;

vInteger, vPembagi : Integer; begin

vPembagi := 0;

GetMem (vPtr, 1024);( alokasi 1 KB memory)

try

vInteger := 100divvPembagi;(terjadi exception)

finally

FreeMem (vPtr, 1024); end;

end.

Beberapa jenisresourceyang harus dilindungi adalah :  File ;

Memory ;

Windows Resource (hanya untuk VCL) ;dan  Object.

Dalam dokumen DAFTAR ISI - PEMROGRAMAN DELPHI (Halaman 51-58)

Dokumen terkait