Abstract Class
Class yang tidak bisa diinstansiasi langsung, dengan method abstract wajib diimplementasi.
Cetak Biru yang Belum Jadi
Abstract class adalah class yang tidak boleh dibuat instance-nya. Ia hanya boleh diwariskan:
abstract class Bentuk {
abstract luas(): number; // wajib diimplementasi subclass
deskripsi(): string {
return `Luas: ${this.luas()}`; // method konkret boleh ada
}
}
const b = new Bentuk();
// Error: Cannot create an instance of an abstract class.
class Persegi extends Bentuk {
constructor(private sisi: number) {
super();
}
luas(): number {
return this.sisi * this.sisi;
}
}
const p = new Persegi(4);
console.log(p.deskripsi()); // "Luas: 16"Subclass yang tidak mengimplementasikan semua method abstract ikut menjadi abstract (tidak bisa diinstansiasi) sampai dilengkapi.
Abstract Class vs Interface
Keduanya mendefinisikan kontrak, tapi beda kemampuan:
| Abstract class | Interface | |
|---|---|---|
| Bisa punya implementasi | Ya | Tidak |
| Bisa punya constructor/state | Ya | Tidak |
Bisa di-extends berkali-kali | Tidak (single inheritance) | Ya (bisa implements banyak) |
| Ada di runtime | Ya | Tidak (hilang saat kompilasi) |
Pilih abstract class saat subclass-subclass berbagi logika atau state yang sama (seperti deskripsi() di atas). Pilih interface saat hanya butuh kontrak bentuk tanpa implementasi bersama.
Pola Template Method
Kekuatan abstract class terlihat di pola template method: kerangka algoritma ditulis sekali di parent, langkah spesifik diserahkan ke subclass:
abstract class Laporan {
buat(): string {
const kepala = this.kepalaLaporan();
const isi = this.isiLaporan();
return `${kepala}\n${isi}`;
}
protected abstract kepalaLaporan(): string;
protected abstract isiLaporan(): string;
}Setiap jenis laporan (PDF, Excel, teks) hanya mengisi dua method abstract, struktur buat() konsisten untuk semua.
Catatan teknis: Karena abstract class ada di runtime, ia bisa dipakai dengan
instanceof. Interface tidak bisa. Kalau kamu butuh mengecek tipe object saat program jalan sekaligus berbagi implementasi, abstract class adalah jawabannya. Kalau hanya butuh kontrak tipe, interface lebih ringan.