{"id":1406,"date":"2013-12-18T23:58:42","date_gmt":"2013-12-18T16:58:42","guid":{"rendered":"http:\/\/www.sulhansetiawan.com\/?p=1406"},"modified":"2013-12-24T23:01:09","modified_gmt":"2013-12-24T16:01:09","slug":"virtual-dynamic-and-abstract-method","status":"publish","type":"post","link":"https:\/\/sulhansetiawan.com\/id\/virtual-dynamic-and-abstract-method\/","title":{"rendered":"Method Virtual, Dynamic, dan Abstract"},"content":{"rendered":"<p><\/p>\n<div style=\"width: 96px; margin-left: auto; margin-right: auto;\"><a href=\"\/id\/?p=1405\"><img decoding=\"async\" src=\"https:\/\/sulhansetiawan.com\/_wordpress_\/2013\/12\/arrowleft_green_32.png\" title=\"Turunan bisa memiliki method yang berbeda aksinya dengan leluhurnya\"\/><\/a><a href=\"\/id\/?p=1379\"><img decoding=\"async\" src=\"https:\/\/sulhansetiawan.com\/_wordpress_\/2013\/12\/home_green_32.png\" title=\"Tutorial Delphi\"\/><\/a><a href=\"\/id\/?p=1407\"><img decoding=\"async\" src=\"https:\/\/sulhansetiawan.com\/_wordpress_\/2013\/12\/arrowright_green_32.png\" title=\"TObject\"\/><\/a><\/div>\n<p>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:<\/p>\n<pre class='brush: delphi'>var\r\n  Gambar:TGambar;\r\n  Lingkaran:TLingkaran;\r\nbegin\r\n\/\/membuat obyek\r\n  Gambar:= TLingkaran.Create;\r\n  Lingkaran:=TLingkaran.Create;\r\n  ....<\/pre>\n<p>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.<\/p>\n<p>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:<\/p>\n<pre class='brush: delphi'>program Turunan3;\r\n{$APPTYPE CONSOLE}\r\ntype\r\n  TPoint=record\r\n    X,Y:integer;\r\n  end;\r\n\r\n  TGambar=class\r\n    Posisi:TPoint;\r\n    procedure GambarObyek;virtual;\r\n  end;\r\n\r\n  TLingkaran=class(TGambar)\r\n    Jari2:integer;  \r\n    procedure GambarObyek;override;\r\n  end;\r\n\r\n  TKotak=class(TGambar)\r\n    Panjang:integer;\r\n    Lebar:integer;    \r\n    procedure GambarObyek;override;\r\n  end;\r\n\r\n  procedure TGambar.GambarObyek;\r\n  begin\r\n    Writeln('Menggambar obyek');\r\n  end;\r\n\r\n  procedure TLingkaran.GambarObyek;\r\n  begin\r\n    Writeln('Menggambar lingkaran');\r\n  end;\r\n\r\n  procedure TKotak.GambarObyek;\r\n  begin\r\n    Writeln('Menggambar kotak');\r\n  end;\r\n\r\nvar\r\n  Gambar:TGambar;\r\n  Pilihan:Char;\r\nbegin\r\n  repeat\r\n    Writeln(#13#10'Tentukan pilihan');\r\n    Writeln('1:Lingkaran');\r\n    Writeln('2:Kotak');\r\n    Writeln('3:Selesai');\r\n    Write('Pilihan Anda: ');\r\n    Readln(Pilihan);\r\n    Writeln;\r\n  \/\/membuat obyek\r\n    case Pilihan of\r\n    '1':Gambar:=TLingkaran.Create;\r\n    '2':Gambar:=TKotak.Create;\r\n    '3':Break;\r\n    else continue;\r\n    end;\r\n  \/\/memanggil method\r\n    Gambar.GambarObyek;\r\n  \/\/membuang obyek\r\n    Gambar.Free;\r\n  until False;\r\nend.<\/pre>\n<p>Kita menambahkan kata <strong>virtual<\/strong> pada GambarObyek untuk TGambar, kemudian pada TLingkaran dan TKotak kita tambahkan kata <strong>override<\/strong>. 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:<\/p>\n<pre>C:\\Source&gt;Turunan3\r\n\r\nTentukan pilihan\r\n1:Lingkaran\r\n2:Kotak\r\n3:Selesai\r\nPilihan Anda: 1\r\n\r\nMenggambar lingkaran\r\n\r\nTentukan pilihan\r\n1:Lingkaran\r\n2:Kotak\r\n3:Selesai\r\nPilihan Anda: 2\r\n\r\nMenggambar kotak\r\n\r\nTentukan pilihan\r\n1:Lingkaran\r\n2:Kotak\r\n3:Selesai\r\nPilihan Anda: 3\r\n\r\n\r\nC:\\Source&gt;\r\n\r\n<\/pre>\n<p>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.<\/p>\n<p>Di bagian awal perulangan, program meminta pilihan kepada pemakai. Pilihan tersebut menentukan proses yang akan dijalankan berikutnya. Jika Pilihan bernilai &#8216;1&#8217;, maka obyek yang dibuat adalah obyek TLingkaran. Jika Pilihan bernilai &#8216;2&#8217;, maka obyek yang dibuat adalah obyek TKotak. Jika Pilihan bernilai &#8216;3&#8217;, maka akan dilakukan <strong>Break<\/strong> 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 <strong>Continue<\/strong> 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.<\/p>\n<p>Perhatikan hasil dari Gambar.GambarObyek saat dijalankan. Method tersebut akan beraksi sesuai dengan jenis obyeknya. Tingkah laku semacam ini sering disebut dengan <strong>polimorfisme<\/strong><p><\/p>\n.<p><\/p>\n<strong>Dynamic<\/strong> method memiliki arti yang sama dengan <strong>virtual<\/strong>. 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.<\/p>\n<p>Dynamic biasanya digunakan jika class dasar memiliki banyak method yang bisa di-override tetapi oleh kebanyakan turunannya sangat jarang di-override.<\/p>\n<h3 id=\"Abstract\">Method abstract <\/h3>\n<p>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 <strong>abstract<\/strong>. Caranya adalah dengan menambahkan kata <strong>abstract<\/strong> setelah kata <strong>virtual<\/strong> atau <strong>dynamic<\/strong>.<\/p>\n<pre class='brush: delphi'>    procedure GambarObyek;virtual;abstract;<\/pre>\n<p>Method yang bersifat abstract tidak membutuhkan implementasi. Jadi Anda bisa membuang bagian:<\/p>\n<pre class='brush: delphi'>  procedure TGambar.GambarObyek;\r\n  begin\r\n    Writeln('Menggambar obyek');\r\n  end;<\/pre>\n<div style=\"width: 96px; margin-left: auto; margin-right: auto;\"><a href=\"\/id\/?p=1405\"><img decoding=\"async\" src=\"https:\/\/sulhansetiawan.com\/_wordpress_\/2013\/12\/arrowleft_green_32.png\" title=\"Turunan bisa memiliki method yang berbeda aksinya dengan leluhurnya\"\/><\/a><a href=\"\/id\/?p=1379\"><img decoding=\"async\" src=\"https:\/\/sulhansetiawan.com\/_wordpress_\/2013\/12\/home_green_32.png\" title=\"Tutorial Delphi\"\/><\/a><a href=\"\/id\/?p=1407\"><img decoding=\"async\" src=\"https:\/\/sulhansetiawan.com\/_wordpress_\/2013\/12\/arrowright_green_32.png\" title=\"TObject\"\/><\/a><\/div>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>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&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[105,104,96,145],"tags":[106],"class_list":["post-1406","post","type-post","status-publish","format-standard","hentry","category-delphi-lazarus","category-programming","category-all","category-tutorial","tag-delphi"],"_links":{"self":[{"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/posts\/1406","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/comments?post=1406"}],"version-history":[{"count":0,"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/posts\/1406\/revisions"}],"wp:attachment":[{"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/media?parent=1406"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/categories?post=1406"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sulhansetiawan.com\/id\/wp-json\/wp\/v2\/tags?post=1406"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}