Property

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:

property Posisi:TPoint read GetPosisi write SetPosisi;

Perhatikan perubahan pada program di bawah ini:

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.

Apakah Anda menyukai post ini? Mengapa tidak memberikan komentar di bawah dan melanjutkan perbincangan, atau berlangganan my feed dan dapatkan artikel semacam ini yang dikirm secara otomatis feed reader Anda.
Harap diperhatikan bahwa komentar atau pertanyaan yang disampaikan haruslah sesuai dengan topik yang sedang dibahas. Komentar atau pertanyaan yang tidak sesuai dengan topik akan kami hapus :!:

Tinggalkan komentar

Sebelum membuat komentar, pastikan Anda telah membaca komentar-komentar sebelumnya. Jangan membuat pertanyaan yang telah ditanyakan. Perhatikan pula link-link dalam artikel. Lihatlah link tersebut sebelum membuat pertanyaan, karena mungkin penjelasan dari pertanyaan Anda telah di jawab dalam link tersebut.

Komentar yang tidak mengikuti aturan ini akan dihapus!

(wajib)

(wajib)


Time limit is exhausted. Please reload the CAPTCHA.