Method Virtual, Dynamic, dan Abstract

Sebenarnya untuk mendapatkan sebuah obyek tidak harus dilakukan kepada variabel dengan tipe yang sama dengan obyeknya, akan tetapi bisa dilakukan kepada variabel dengan tipe leluhur obyeknya. Sebagai contoh, untuk mendapatkan obyek dengan tipe TLingkaran, maka kita tidak hanya dapat menerapkan kepada variabel Lingkaran yang bertipe TLingkaran saja, tetapi kita juga dapat menerapkan kepada variabel Gambar yang bertipe leluruh dari TLingkaran seperti contoh berikut:

var
  Gambar:TGambar;
  Lingkaran:TLingkaran;
begin
//membuat obyek
  Gambar:= TLingkaran.Create;
  Lingkaran:=TLingkaran.Create;
  ....

Akan tetapi jika kita memanggil method GambarObyek kepada Gambar, maka yang akan dipanggil adalah method GambarObyek milik TGambar, bukan milik TLingkaran walaupun Gambar adalah obyek dari TLingkaran. Hal ini tentu saja terkadang kurang menguntungkan terutama jika class leluhur ditujukan sebagai sebuah generalisasi.

Jika kita ingin membuat class dasar yang ditujukan untuk generalisasi, kita bisa memberikan method-method virtual kepada class dasarnya. Kemudian kita membuat method override pada class turunannya. Perhatikan contoh berikut:

program Turunan3;
{$APPTYPE CONSOLE}
type
  TPoint=record
    X,Y:integer;
  end;

  TGambar=class
    Posisi:TPoint;
    procedure GambarObyek;virtual;
  end;

  TLingkaran=class(TGambar)
    Jari2:integer;  
    procedure GambarObyek;override;
  end;

  TKotak=class(TGambar)
    Panjang:integer;
    Lebar:integer;    
    procedure GambarObyek;override;
  end;

  procedure TGambar.GambarObyek;
  begin
    Writeln('Menggambar obyek');
  end;

  procedure TLingkaran.GambarObyek;
  begin
    Writeln('Menggambar lingkaran');
  end;

  procedure TKotak.GambarObyek;
  begin
    Writeln('Menggambar kotak');
  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.

Kita menambahkan kata virtual pada GambarObyek untuk TGambar, kemudian pada TLingkaran dan TKotak kita tambahkan kata override. Perhatikan bahwa variabel yang kita gunakan adalah bertipe TGambar, akan tetapi method yang dipanggil akan menyesuaikan dengan tipe obyek. Jika obyek yang dibuat adalah bertipe TLingkaran, maka method yang dipanggil adalah method milik TLingkaran. Jika obyek yang dibuat adalah TKotak, maka method yang dipanggil adalah method milik TKotak. Perhatikan hasil keluarannya jika program dijalankan seperti berikut:

C:\Source>Turunan3

Tentukan pilihan
1:Lingkaran
2:Kotak
3:Selesai
Pilihan Anda: 1

Menggambar lingkaran

Tentukan pilihan
1:Lingkaran
2:Kotak
3:Selesai
Pilihan Anda: 2

Menggambar kotak

Tentukan pilihan
1:Lingkaran
2:Kotak
3:Selesai
Pilihan Anda: 3


C:\Source>

Program Turunan3 menggunakan perulangan dengan repeat until pada proses utamanya. Ekpresi yang diberikan untuk until adalah konstanta dengan nilai False sehingga perulangannya menjadi perulangan yang tidak akan pernah selesai.

Di bagian awal perulangan, program meminta pilihan kepada pemakai. Pilihan tersebut menentukan proses yang akan dijalankan berikutnya. Jika Pilihan bernilai ‘1’, maka obyek yang dibuat adalah obyek TLingkaran. Jika Pilihan bernilai ‘2’, maka obyek yang dibuat adalah obyek TKotak. Jika Pilihan bernilai ‘3’, maka akan dilakukan Break yaitu perintah untuk keluar dari perulangan. Perintah ini bisa diterapkan kepada semua jenis perulangan. Jika Pilihan bernilai selain dari ketiga pilihan di atas, maka yang akan dilakukan adalah Continue yaitu perintah untuk melanjutkan perulangan (kembali ke bagian awal perulangan) tanpa melaksanakan sisa perintah dibawah perintah tersebut. Perintah ini juga bisa diterapkan untuk semua jenis perulangan.

Perhatikan hasil dari Gambar.GambarObyek saat dijalankan. Method tersebut akan beraksi sesuai dengan jenis obyeknya. Tingkah laku semacam ini sering disebut dengan polimorfisme

.

Dynamic method memiliki arti yang sama dengan virtual. Perbedaan antara dua method tersebut hanya terletak pada cara mengimplementasikan pemanggilan method-nya saat dijalankan. Virtual membuat optimisasi kecepatan sedangkan dynamic membuat optimisasi ukuran kode program.

Dynamic biasanya digunakan jika class dasar memiliki banyak method yang bisa di-override tetapi oleh kebanyakan turunannya sangat jarang di-override.

Method abstract

Pada program Turunan3, TGambar benar-benar hanya digunakan untuk generalisasi. Dengan demikian, method GambarObyek untuk TGambar tidak pernah dipanggil. Jika kita mengalami kasus seperti ini, maka kita bisa membuat method yang bersifat abstract. Caranya adalah dengan menambahkan kata abstract setelah kata virtual atau dynamic.

    procedure GambarObyek;virtual;abstract;

Method yang bersifat abstract tidak membutuhkan implementasi. Jadi Anda bisa membuang bagian:

  procedure TGambar.GambarObyek;
  begin
    Writeln('Menggambar obyek');
  end;

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.