Object Oriented Programming Pada Delphi - Bag 4

Para Delphi dan OOP Mania, pada artikel sebelumnya kita telah mempelajari cara mengalokasikan dan membebaskan memori sebuah objek. Pada artikel berikut ini, saya akan coba menjelaskan bagaimana cara mendeklarasikan sebuah kelas lengkap dengan method – methodnya. Selamat mengikuti.

Seperti yang telah kita pelajari pada artikel sebelumnya, kelas adalah sebuah pola/rancangan/struktur data. Pada artikel tersebut, kita telah mendeklarasikan kelas sebagai berikut :

Type
 TStudent = Class
  FNama : String;
  FNIS : String;
  FAlamat : String;
  FTelpon : String;
 End;

Jika kita membuat empat objek bertipe TStudent, maka masing-masing objek tersebut akan mempunyai atribut yang sama yaitu nama,nis, alamat dan telpon. Struktur dari masing-masing objek tadi sama persis,dan struktur objek ini ditentukan pada/oleh kelas TStudent.


Atribut-atribut yang ada pada objek student – dalam kasus ini yaitu FNama, FNIS, Falamat ,dan FTelpon, di OOP dikenal dengan beberapa nama. Kadang disebut instance variables, data members, properties dan fields. Hati-hati, jangan terkecoh dengan fields yang berarti kolom pada table.


Jika kita telah terbiasa dengan tipe data Record, tentunya kita akan melihat bahwa struktur sebuah kelas tidak berbeda dengan struktur tipe data record. Keduanya merupakan tipe data yang merupakan gabungan dari beberapa data. Lalu apa yang membedakan kelas dengan tipe data record ? Di dalam kelas, kita bisa membuat procedure (biasa disebut method). Dengan method ini nantinya objek yang kita buat bisa melakukan sesuatu. Method untuk kelas TStudent bisa "RegisterForClass", "SavetoTable", "SendInvoice", dll. Untuk lebih memberi gambaran apa itu method, coba anda buka kelas TstringList dan TiniFile. Sebutkan method-method yang ada pada kedua kelas tersebut.

Saatnya Kita Menuliskan Method


Ada dua langkah yang harus kita lakukan ketika akan membuat sebuah method. Yang pertama, kita harus deklarasikan method tersebut pada bagian deklarasi kelas. Hal ini hampir sama dengan pendeklarasian atribut/properties kelas. Deklarasi ini akan memberitahulan ke compiler method-method apa saja yang dimiliki kelas ini. Method pada kenyataannya sama dengan function atau procedure. Method bisa mengembalikan nilai dan bisa juga menerima parameter. Berikut ini adalah contoh kelas dengan empat atribut dan tiga methods :
Type
 TSquare = Class
  FX, FY : Integer;
  FWidth : Integer;
  Caption : String;
  Function Area : Integer; // hitung luas
  Procedure MoveLeft(dx, dy : Integer); menggerakan ke kiri
  Procedure MoveRight(dx, dy : Integer); menggerakan ke kanan
End;

Langkah selanjutnya yaitu menuliskan baris kode untuk method-method tadi. Kita nanti akan melihat bagaimana cara menuliskan baris kode pada sebuah method , namun sebelum itu coba kita lihat bagaimana kita akan menggunakan method-method tersebut:

Var
 Square1 : TSquare;
 SqWidth : Integer;

Begin
 Square1 := TSquare.Create;
 Try
  Square1.Fx := 10;
  Square1.Fy := 20;
  Square1.FWidth := 7;

  SqWidth := Square1.Area; // 49 nilai yg kita harapkan       Square1.MoveLeft(2, 3);
 Finally
  Square1.Free;
 End;

Seperti yang kita lihat pada baris kode di atas, kita bisa memanggil method dengan menuliskan nama method tersebut diawali dengan nama objeknya (disambung dengan dot/titik) , hal ini sama dengan cara memanggil atribut kelas. Sekarang, jika kita mempunyai dua buah objek bertipe TSquare, dan kita panggil salah satu method, atribut mana yang dipakai oleh method tersebut ? Perhatikan baris kode berikut ini :

Var
 Square1 : TSquare;
 Square2 : TSquare;
 SqWidth : Integer;

Begin
 Square1 := TSquare.Create;
 Square1.FWidth := 7;

 Square2 := TSquare.Create;
 Square2.FWidth := 5;
 SqWidth := Square1.Area; // Hasilnya 49 atau 25?

Berapa nilai sqWidth? Kita inginkan nilainya 49 – yang didapat dari nilai atribut Width x Width. Dan memang demikian. Lalu kenapa bisa nilainya 49 kok bukan 25? Perhatikan, bahwa sebuah method akan menggunakan atribut dari objek yang memanggilnya. Jika kita memanggil method area dari objek Square1 , maka method ini akan menggunakan atribut width milik objek square1 yang bernilai 7.


Sejauh ini kita sudah mengetahui cara mendeklarasikan sebuah method. Selanjutnya kita harus menuliskan baris kode yang merupakan implementasi method yang kita deklarasikan.Kita harus tuliskan baris kode tersebut pada bagian implementation. Bagaimana caranya? Mudah, tuliskan seperti kita menulis sebuah procedure/function seperti biasa. Tapi satu hal yang perlu kita perhatikan. Kita harus bertitahu compiler bahwa procedure yang kita tuliskan bukan procedure seperti biasanya. Caranya dengan menambahkan nama kelas sebelum nama methos (disambung dengan dot/titik). Lihat contoh dibawah ini :

TSquare.Area : Integer;

//dan

Procedure TSquare.MoveLeft(dx, dy : Integer);

Yang perlu anda catat bahwa, kenapa objek yang memanggil method area tidak dijadikan parameter? Lalu bagaimana method – yang aslinya berupa procedure/function biasa – bisa mengakses data dari objek tersebut? Sebenarnya , objek tersebut dijadikan parameter pada method tadi, tapi kita tidak melihatnya, atau lebih tepatnya kita tidak mau menuliskannya. Ketika kita menuliskan baris kode :

SqWidth := Square1.Area; // 49

Compiler sebenarnya mengenerate baris kode :

SqWidth := Area( Square1 )

Jadi secara “Behind the scenes” compiler menjadikan objek sebagai parameter. Di damal method, kita bisa menggunakan “identifier” self untuk mengacu ke objek yang memanggil method tersebut.Ketika kita menuliskan baris kode :
Square1.Area

Di dalam method tersebut Self mengacu ke objek Square1. Jika kita menulis baris kode :

Square2.Area

Berarti Self mengacu ke objek Square2.
Di bawah ini keseluruhan kode untuk method Area:

Function TSquare.Area : Integer;

Begin
 Result := Self.FWidth * Self.FWidth;
End;

Dan di bawah ini keseluruhan kode untuk method MoveLeft dan MoveRight:

Procedure TSquare.MoveLeft( dx, dy : Integer);

Begin
 Self.Fx := Self.Fx – dx;
 Self.Fy := Self.Fy – dy;
End;
Procedure TSquare.MoveRight( dx, dy : Integer);

Begin
 Self.Fx := Self.Fx + dx;
 Self.Fy := Self.Fy + dy;
End;

Pada sebagian besar kasus, penggunaak Self merupakan opsional saja – jadi kita bisa langsung mengakses atribut objek tanpa didahului self, seperti pada baris kode berikut ini :

Function TSquare.Area : Integer;

Begin
 Result := FWidth * FWidth;
End;

Baris kode di atas tidak menimbulkan error. Hal ini karena compiler tahu method yang dipanggil tersebut milik kelas apa, oleh karena itu compiler tahu atribut yang kita akses baik kita menggunakan self atau tidak. . Namun ada satu pengecualian, jika kita mempunyai variable lokal pada method yang namanya sama persis dengan atribut objek, maka untuk mengakses atribut objek harus didahuui dengan self, jika tidak maka compiler akan membaca variable lokal tersebut (bukan atribut objek) , perhatikan contoh di bawah ini :

Function TSquare.Area : Integer;

Var
 FWidth : Integer; 
Begin
 Result := FWidth * FWidth;
End;

Pada method di atas terdapat satu variable lokal bernama Fwidth. Jika kita akses Fwidth tanpa diawalai Self, maka compiler akan memanggil Fwidth (variable lokal) bukan Fwidth (Atribut objek)

Tip

Setelah kita deklarasikan method kita bisa klik Ctrl Shift C –Delphi akan mengenerate kode (hanya outline) di bagian implementation. (Bersambung)


0 comments:

Post a Comment