Pewarisan dan metode virtual

Pewarisan, metode virtual, override, reintroduce

Contoh pewarisan kelas

Object Pascal mendukung pewarisan dan metode virtual. Pada contoh berikut, TDog mewarisi dari TAnimal:

TDog adalah subkelas (kelas turunan), sedangkan TAnimal adalah induk kelas (kelas dasar)

program AnimalDemo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;

type
  // Kelas induk hewan
  TAnimal = class
    procedure Cry; virtual; // Metode virtual: suara hewan
  end; // Akhir definisi kelas, cukup tulis end;

  // Subkelas Anjing, mewarisi Animal dan ganti suara tangisan
  TDog = class(TAnimal)
    procedure Cry; override;
  end;

procedure TAnimal.Cry;
begin
  WriteLn('Hewan mengeluarkan suara');
end;

procedure TDog.Cry;
begin
  WriteLn('Guk guk guk');
end;

var
  Pet: TAnimal;
begin
  // Instansi kelas induk
  Pet := TAnimal.Create;
  try
    Pet.Cry;
  finally
    FreeAndNil(Pet);
  end;

  // Instansi subkelas disimpan di variabel kelas induk, polimorfisme aktif
  Pet := TDog.Create;
  try
    Pet.Cry;
  finally
    FreeAndNil(Pet);
  end;
end.Code language: JavaScript (javascript)

Hasil eksekusi

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
45 lines compiled, 0.1 sec, 68544 bytes code, 4260 bytes data

D:\fpcdemo>mydemo
Hewan mengeluarkan suara
Guk guk gukCode language: CSS (css)

FreeAndNil

Pelepasan objek dengan aman, menggabungkan dua langkah jadi satu:

  1. Panggil fungsi Free pada objek untuk menghapus memori;
  2. Isi variabel dengan nilai nil guna mencegah pointer menggantung.

Kode di atas menyimpan objek subkelas TDog ke dalam variabel Pet bertipe TAnimal. Saat memanggil Cry melalui Pet, yang dijalankan adalah prosedur Cry milik TDog bukan milik TAnimal, hal ini disebut polimorfisme.

  • Cry; virtual menandai metode induk sebagai virtual dan mengaktifkan polimorfisme saat runtime;
  • Subkelas menimpa Cry dengan kata kunci override;
  • Variabel dideklarasikan sebagai TAnimal namun berisi objek asli TDog, sehingga suara gonggongan anjing akan berjalan otomatis.

Metode yang diberi tanda virtual: kompiler akan mencocokkan implementasi metode yang sesuai saat runtime berdasarkan tipe asli dari objek.

Jika Anda menghapus tulisan virtual dan override

Kedua pemanggilan akan menjalankan metode milik kelas induk

Gambar di atas menampilkan hasil setelah menghapus virtual dan override

Semua output berasal dari implementasi di dalam TAnimal

Kompiler hanya mengenali tipe deklarasi variabel TMyClass dan mengabaikan tipe asli objek saat program berjalan.

  • Metode biasa secara bawaan bukan virtual, hanya akan menjadi virtual jika diberi penanda virtual;
  • Untuk menimpa metode virtual warisan di subkelas wajib pakai override, jika tidak kompiler akan mengeluarkan peringatan;
  • Gunakan reintroduce jika ingin menyembunyikan metode virtual nama sama dari kelas induk tanpa menimpanya (tidak disarankan karena membingungkan), setara dengan kata kunci new di C#

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *