Control the permissions for external libraries to inherit, implement and instantiate classes, restricting type bodies
Modifier order [abstract] [base/interface/final/sealed] [mixin] class; some modifiers are mutually exclusive
1. No modifier
Any library can instantiate, inherit or implement
// 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 abstract class
Cannot be instantiated; external libraries may use extends /implements
abstract class Vehicle {
void move(); // abstract method
}
// Valid
class Car extends Vehicle {
@override void move() {}
}
class Mock implements Vehicle {
@override void move() {}
}
// Vehicle(); // Error, cannot instantiate
Code language: JavaScript (javascript)
3. base class
√ Allowed new|√ External extends|× External implements
Guarantees subclasses inherit parent implementation, preventing fake external implementations
// lib/a.dart
base class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
base class Car extends Vehicle {} // √ Inheritance requires base/final/sealed
// class Mock implements Vehicle {} // × External implementation disallowed
Code language: JavaScript (javascript)
4. interface class
√ Allowed new|× External extends|√ External implements
// a.dart
interface class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // × External inheritance forbidden
class Mock implements Vehicle { // √ Implementation permitted
@override void move() {}
}
Code language: PHP (php)
abstract interface
Pure interface, widely used
Cannot be instantiated; external code may only implement it
abstract interface class Vehicle {
void move();
}
class Mock implements Vehicle {
@override void move() {}
}
Code language: PHP (php)
5. final class
√ Allowed new|× External extends|× External implements
No external derivation, ensures stable public API
// 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
× Cannot new|× External extends/implements; subclasses must reside within the same file
Compiler recognizes all direct subclasses; switch requires exhaustive matching
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 is implicitly abstract, uninstantiable
Code language: PHP (php)
Mutual Exclusivity Rules
sealed+abstract: sealed implicitly carries abstract; redundant and prohibitedinterface/final/sealed+mixin: cannot be combined- Cannot declare base /interface/final /sealed simultaneously on one level
Class Modifiers