Mengatur izin pewarisan, implementasi, dan instansiasi kelas oleh pustaka eksternal, serta membatasi badan tipe
Urutan pengubah [abstract] [base/interface/final/sealed] [mixin] class; beberapa pengubah saling eksklusif
1. Tanpa pengubah
Semua pustaka boleh membuat instan, mewarisi, dan mengimplementasikan
// a.dart
class Vehicle {
void move() {}
}
// b.dart
import 'a.dart';
Vehicle v = Vehicle();
class Car extends Vehicle {}
class Mock implements Vehicle {}
Code language: JavaScript (javascript)
2. abstract kelas abstrak
Tidak dapat diinstansiasi; kode eksternal boleh menggunakan extends /implements
abstract class Vehicle {
void move(); // metode abstrak
}
// Sah
class Car extends Vehicle {
@override void move() {}
}
class Mock implements Vehicle {
@override void move() {}
}
// Vehicle(); // Galat, tidak bisa membuat instan
Code language: JavaScript (javascript)
3. base class
√ Boleh new|√ extends dari luar diizinkan|× implements dari luar dilarang
Menjamin subkelas pasti mewarisi implementasi induk, mencegah pembuatan implementasi palsu dari kode eksternal
// lib/a.dart
base class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
base class Car extends Vehicle {} // √ Pewarisan wajib menuliskan base/final/sealed
// class Mock implements Vehicle {} // × Implementasi dari luar dilarang
Code language: JavaScript (javascript)
4. interface class
√ Boleh new|× extends dari luar dilarang|√ implements dari luar diizinkan
// a.dart
interface class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // × Tidak boleh mewarisi dari luar
class Mock implements Vehicle { // √ Implementasi diizinkan
@override void move() {}
}
Code language: PHP (php)
abstract interface
Antarmuka murni, paling sering dipakai
Tidak dapat diinstansiasi; dari luar hanya boleh melakukan implements
abstract interface class Vehicle {
void move();
}
class Mock implements Vehicle {
@override void move() {}
}
Code language: PHP (php)
5. final class
√ Boleh new|× extends dari luar dilarang|× implements dari luar dilarang
Tidak ada turunan dari luar, menjaga API publik agar stabil
// a.dart
final class Vehicle {}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // ❌
// class Mock implements Vehicle{} // ❌
Code language: JavaScript (javascript)
6. sealed class (kelas tersegel)
× Tidak boleh new|× extends/implements dari luar dilarang;subkelas hanya boleh ditulis di berkas yang sama
Kompiler mengenali semua subkelas langsung, perintah switch wajib mencakup semua kasus
sealed class Vehicle {}
class Car extends Vehicle {}
class Bike extends Vehicle {}
void test(Vehicle v) {
switch(v) {
case Car(): print("car");
case Bike(): print("bike");
}
}
// Vehicle(); // ❌ sealed bersifat abstract secara implisit, tidak bisa diinstansiasi
Code language: PHP (php)
Aturan Saling Eksklusif
sealed+abstract: sealed sudah memiliki sifat abstract, kombinasi dilaranginterface/final/sealed+mixin: tidak dapat digabungkan- Tidak boleh menuliskan base /interface/final /sealed bersamaan di tingkat yang sama
Class Modifiers Pengubah Kelas