Class Modifiers

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

  1. sealed + abstract: sealed implicitly carries abstract; redundant and prohibited
  2. interface/final/sealed + mixin: cannot be combined
  3. Cannot declare base /interface/final /sealed simultaneously on one level

Class Modifiers

Leave a Reply

Your email address will not be published. Required fields are marked *