Abstract Class
Tujuan Pembelajaran
Section titled “Tujuan Pembelajaran”Setelah membaca halaman ini, kamu diharapkan dapat:
- Menjelaskan arti dan kegunaan Abstract Class.
- Membuat Abstract Class dan Abstract Method.
- Mengimplementasikan Abstract Class pada subclass nyata.
Pendahuluan
Section titled “Pendahuluan”Pernahkah kamu membuat class induk yang sebenarnya tidak masuk akal jika dicetak langsung menjadi objek?
Contoh: Class Hewan. Objek kucing nyata ada, objek anjing nyata ada. Tetapi bagaimana wujud objek “Hewan” saja secara fisik? Tidak ada wujudnya, karena “Hewan” adalah konsep abstrak.
Untuk situasi ini, TypeScript menyediakan fitur Abstract Class — cetak biru setengah jadi yang dilarang diinstansiasi langsung.
Penjelasan Materi: Apa itu Abstract Class?
Section titled “Penjelasan Materi: Apa itu Abstract Class?”Abstract Class adalah class yang:
- Ditandai dengan kata kunci
abstract. - Tidak bisa dibuat objeknya secara langsung menggunakan
new(akan memicu error). - Hanya digunakan sebagai induk untuk di-extends oleh class anak.
Di dalam abstract class, kita bisa membuat Abstract Method — method kosong tanpa tubuh {} yang wajib ditulis ulang dan dilengkapi isinya oleh class anak.
abstract class Hewan { // Abstract method (tanpa tubuh {}) abstract bersuara(): void;}Analogi Kehidupan Sehari-hari: Sketsa Blueprint Cetak Biru yang Belum Selesai
Section titled “Analogi Kehidupan Sehari-hari: Sketsa Blueprint Cetak Biru yang Belum Selesai”Bayangkan arsitek memberikan gambar sketsa rumah setengah jadi kepada kontraktor:
Arsitek: "Ini sketsa dasar. Wajib ada Pintu Depan dan Atap."Sketsa dasar ini adalah Abstract Class. Kontraktor tidak bisa membangun rumah hanya dari coretan setengah jadi ini. Kontraktor harus melengkapi detailnya terlebih dahulu (membuat class anak konkrit seperti RumahKayu atau RumahBeton) sebelum rumah fisik bisa dibangun.
Visual Illustration: Struktur Abstract Class
Section titled “Visual Illustration: Struktur Abstract Class” Abstract Class: Hewan (Tidak bisa di-new ✗) └── abstract bersuara() (tanpa tubuh) │ ▼ extends Class Kucing (Bisa di-new ✓) └── bersuara() { console.log("Meong") } (wajib melengkapi tubuh method)Mari Mencoba: Penerapan Abstract Class
Section titled “Mari Mencoba: Penerapan Abstract Class”Mari kita buat program class abstrak Bentuk untuk menghitung luas bangun datar.
Buat file bernama src/bab8/abstract-class.ts:
// 1. Membuat Abstract Classabstract class BangunDatar { constructor(public nama: string) {}
// Method biasa (boleh ada di abstract class) tampilkanInfo(): void { console.log(`Bangun Datar: ${this.nama}`); }
// Abstract Method (Wajib diimplementasikan di class anak) abstract hitungLuas(): number;}
// 2. Class Anak Persegi (Wajib melengkapi hitungLuas)class Persegi extends BangunDatar { constructor(nama: string, public sisi: number) { super(nama); }
hitungLuas(): number { return this.sisi * this.sisi; }}
// 3. Class Anak Lingkaranclass Lingkaran extends BangunDatar { constructor(nama: string, public jariJari: number) { super(nama); }
hitungLuas(): number { return parseFloat((Math.PI * this.jariJari * this.jariJari).toFixed(2)); }}
// --- Menggunakan Class ---// const bangun = new BangunDatar("abstrak"); // ✗ Error! Cannot create an instance of an abstract class.
const kotak = new Persegi("Persegi A", 5);const bulat = new Lingkaran("Lingkaran B", 7);
kotak.tampilkanInfo();console.log(`Luas Kotak: ${kotak.hitungLuas()}`);
console.log("\n");bulat.tampilkanInfo();console.log(`Luas Bulat: ${bulat.hitungLuas()}`);Jalankan dengan perintah:
tsx src/bab8/abstract-class.tsOutput
Section titled “Output”Bangun Datar: Persegi ALuas Kotak: 25
Bangun Datar: Lingkaran BLuas Bulat: 153.94Penjelasan Baris per Baris
Section titled “Penjelasan Baris per Baris”abstract class BangunDatar— menandai bahwa class ini bersifat abstrak, tidak bisa dibuat objeknya menggunakannew BangunDatar().abstract hitungLuas(): number;— mendeklarasikan nama dan tipe return method tanpa menulis tubuh logikanya. Ini seperti memberikan “tugas wajib” bagi class anak.class Persegi extends BangunDatar— jika class anak tidak menuliskan methodhitungLuas(), TypeScript akan menampilkan error merah di editor.
Kesalahan yang Sering Terjadi
Section titled “Kesalahan yang Sering Terjadi”❌ Lupa menuliskan method abstrak di class anak
Section titled “❌ Lupa menuliskan method abstrak di class anak”class Segitiga extends BangunDatar { // Error! Non-abstract class 'Segitiga' does not implement inherited abstract member 'hitungLuas'.}Perbaikan: Pastikan seluruh method yang ditandai abstract di class induk ditulis ulang dan dilengkapi tubuh {}-nya di dalam class anak.
Latihan
Section titled “Latihan”- Buat abstract class
Pekerjadengan constructornamadan abstract methodkerja(): void. - Buat class anak
Gurudan lengkapi methodkerja()dengan pesan mengajar. - Buat objek Guru dan jalankan method
kerja().
Ringkasan
Section titled “Ringkasan”- Abstract Class ditandai keyword
abstractdan tidak bisa diinstansiasi secara langsung menggunakannew. - Berguna sebagai kontrak cetak biru induk yang memaksa kesamaan struktur pada class-class anak.
- Abstract Method wajib dilengkapi tubuh kodenya oleh class anak.