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 TMyClasssecara 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
Xbukan instansi kelas target, pemanggilan metode akan menyebabkan memori melampaui batas, stack crash, pengecualian acak (perilaku tidak terdefinisi); - Hanya boleh dipakai setelah pengecekan awal dengan
isuntuk 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)