Apa yang sudah dilakukan pada program Visibilitas adalah sudah cukup untuk menjaga konsistensi data, akan tetapi cara tersebut masih terasa kurang alami. Alangkah lebih mudahnya jika kita tetap memperlakukan posisi seperti sebuah variabel biasa. Jika kita menginginkan nilainya maka kita menempatkan variabel tersebut pada sebelah kanan operator penugasan. Sebaliknya jika kita ingin mengubah nilainya maka kita menempatkan variabel tersebut pada sebelah kiri operator penugasan.
Tidak masalah, keinginan Anda dikabulkan! Dengan menggunakan mekanisme property, maka Anda bisa memperlakukan Posisi seperti halnya variabel biasa.
Pindahkan fungsi GetPosisi dan prosedur SetPosisi ke bagian private sehingga kedua method itupun sekarang hanya dapat diakses secara internal oleh TGambar. Pada bagian public, tambahkan baris berikut:
1 | property Posisi:TPoint read GetPosisi write SetPosisi; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | program Visibilitas2; {$APPTYPE CONSOLE} type TPoint=record X,Y:integer; end; TGambar=class(TObject) private FPosisi:TPoint; function GetPosisi:TPoint; procedure SetPosisi(const Value:TPoint); public procedure GambarObyek; property Posisi:TPoint read GetPosisi write SetPosisi; end; procedure TGambar.GambarObyek; begin Write('Menggambar obyek pada '); Writeln(FPosisi.X,':',FPosisi.Y); end; function TGambar.GetPosisi:TPoint; begin result:=FPosisi; end; procedure TGambar.SetPosisi(const Value:TPoint); begin //tidak ada yang perlu dilakukan jika //Value sama dengan Posisi if(Value.X=FPosisi.X)and(Value.Y=FPosisi.Y) then exit; FPosisi:=Value; //merefleksikan perubahan GambarObyek; end; var Gambar:TGambar; Pilihan:Char; P:TPoint; begin //membuat obyek Gambar:=TGambar.Create; Gambar.GambarObyek; repeat Writeln(#13#10'Tentukan pilihan'); Writeln('1:Melihat posisi'); Writeln('2:Memindah posisi'); Writeln('3:Menggambar ulang'); Writeln('4:Selesai'); Write('Pilihan Anda: '); Readln(Pilihan); Writeln; case Pilihan of '1':begin P:=Gambar.Posisi; Write('Posisi gambar pada '); Writeln(P.X,':',P.Y); end; '2':begin Write('Posisi X baru: '); Readln(P.X); Write('Posisi Y baru: '); Readln(P.Y); Gambar.Posisi:=P; end; '3':Gambar.GambarObyek; '4':Break; else continue; end; until False; //membuang obyek Gambar.Free; end. |
Perhatikan bagaimana kita mendapatkan nilai posisi dan bagaimana memberi nilai yang baru. Tepat seperti akses terhadap variabel biasa. Mekanisme seperti ini sering disebut dengan abstraksi dan enkapsulasi. Perhatikan bahwa posisi adalah sesuatu yang abstrak. Kita melihatnya seolah-olah itu adalah variabel biasa. Padahal akses terhadap posisi adalah melalui sebuah method berupa GetPosisi untuk membaca dan method SetPosisi untuk menulis. Kerumitan-kerumitan tersebut kita bungkus (proses enkapsulasi) dalam sebuah mekanisme yang menjadikannya terlihat sederhana.
Cara membuat property
Untuk membuat property, pertama kali kita tentukan tipe dari property-nya. Jika property tersebut adalah property yang bisa dibaca, maka kita harus membuat sebuah fungsi dengan nilai kembalian dengan tipe yang sama dengan tipe property-nya. Jika property tersebut bisa dimodifikasi, maka kita harus membuat sebuah prosedur yang mengambil satu parameter dengan tipe sesuai tipe property-nya. Kemudian kita tempatkan fungsinya setelah kata read dan kita tempatkan prosedurnya setelah kata write.
property bisa bersifat read only, yaitu jika property tersebut tidak memiliki bagian write, atau write only, yaitu jika property tersebut tidak memiliki bagian read.

