Ringkasan is dan as

Pascal/FPC operator is pengecekan tipe, as konversi aman, TClass(X) konversi paksa mentah tanpa validasi

Penggunaan is dan as

1 Operator is: Deteksi tipe saat runtime

Memeriksa apakah instansi objek berasal dari kelas tertentu atau subkelasnya, mengembalikan nilai boolean True/False, dipakai untuk validasi awal yang aman.

2 Operator as: Konversi tipe yang aman

Konversi naik / turun dengan validasi tipe saat runtime; akan melempar pengecualian secara langsung jika tipe tidak cocok, keamanan menjadi prioritas utama.

3 TMyClass(X) konversi paksa mentah (unchecked typecast)

Tidak ada validasi runtime, langsung memaknai ulang memori secara paksa; eksekusinya lebih cepat, namun jika tipe tidak sesuai akan muncul perilaku tidak terdefinisi (program crash, panggilan metode salah, kesalahan memori). Hanya gunakan setelah memverifikasi tipe dengan is.

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

type
  // Kelas induk
  TFather = class
    procedure FatherMethod;
  end;

  // Kelas turunan yang mewarisi TFather
  TSon = class(TFather)
    procedure SonMethod;
  end;

procedure TFather.FatherMethod;
begin
  WriteLn('FatherMethod');
end;

procedure TSon.SonMethod;
begin
  WriteLn('SonMethod');
end;

var
  Son: TSon;
  C: TFather; // Variabel referensi kelas induk
begin
  Son := TSon.Create;
  try
    // Instansi kelas turunan bisa memanggil semua metode secara langsung
    Son.FatherMethod;
    Son.SonMethod;

    // Konversi naik: tetapkan kelas turunan ke referensi kelas induk, valid secara sintaks
    C := Son;
    C.FatherMethod; // Referensi kelas induk dapat memanggil metode miliknya sendiri

    // C.SonMethod; // Galat kompilasi: TFather tidak memiliki metode ini

    // 1. Pengecekan tipe is + konversi aman as
    if C is TSon then
      (C as TSon).SonMethod;

  finally
    FreeAndNil(Son);
  end;
end.Code language: JavaScript (javascript)

Hasil eksekusi

FatherMethod
SonMethod
FatherMethod
SonMethod

C awalnya adalah referensi tipe TFather C: TFather;, namun menunjuk objek hasil penugasan C := Son;. Kelas turunan dapat memanggil metode kelas induk melalui C.FatherMethod;,

Untuk memanggil metode khusus kelas turunan (C as TSon).SonMethod; wajib lakukan pengecekan tipe pakai is terlebih dahulu if C is TSon then guna menghindari galat saat runtime.

Perbandingan konversi as dan TFather(X)

1. X as TFather

Konversi aman, disarankan untuk skenario umum

  • Melakukan pengecekan tipe di balik layar saat runtime, setara dengan menjalankan X is TMyClass secara implisit;
  • Jika tipe tidak cocok akan muncul pengecualian EInvalidCast, program dapat menangkap kesalahan tersebut;
  • Ada beban performa yang kecil, dapat diabaikan untuk sebagian besar kode bisnis.

2. TFather(X) konversi paksa mentah

Konversi tanpa validasi, hanya untuk skenario performa tinggi, langsung memaknai memori secara paksa tanpa pengecekan.

  • Melewatkan seluruh pengecekan tipe runtime, langsung memaknai pointer objek secara paksa;
  • Kecepatan eksekusi sedikit lebih cepat;
  • Risiko: Jika X bukan instansi kelas target, pemanggilan metode akan menyebabkan memori melampaui batas, stack crash, pengecualian acak (perilaku tidak terdefinisi);
  • Hanya boleh dipakai setelah pengecekan awal dengan is untuk menjamin tipe cocok:
// Cara aman 1: konversi as (umum dipakai)
if A is TFather then
  (A as  TFather).CallSomeMethodOfFather;

// Cara aman 2: konversi paksa mentah (performa maksimal, sudah dicek dengan is sebelumnya)
if A is TFather then
  TMyClass(A).CallSomeMethodOfMyClass;Code language: JavaScript (javascript)

Tinggalkan Balasan

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