Управление правами наследования, реализации и создания экземпляров классов из внешних библиотек, ограничение тел типов
Порядок модификаторов [abstract] [base/interface/final/sealed] [mixin] class; некоторые модификаторы взаимоисключают друг друга
1. Без модификатора
Любая библиотека может создавать экземпляры, наследоваться и реализовывать
// 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 абстрактный класс
Нельзя создавать экземпляры; внешний код может использовать extends /implements
abstract class Vehicle {
void move(); // абстрактный метод
}
// Допустимо
class Car extends Vehicle {
@override void move() {}
}
class Mock implements Vehicle {
@override void move() {}
}
// Vehicle(); // Ошибка, невозможно создать экземпляр
Code language: JavaScript (javascript)
3. base class
√ Разрешён new|√ Внешнее наследование extends разрешено|× Внешняя реализация implements запрещена
Гарантирует, что подклассы наследуют реализацию родительского класса, предотвращает фальшивые реализации из внешнего кода
// lib/a.dart
base class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
base class Car extends Vehicle {} // √ При наследовании требуется указать base/final/sealed
// class Mock implements Vehicle {} // × Внешняя реализация запрещена
Code language: JavaScript (javascript)
4. interface class
√ Разрешён new|× Внешнее наследование extends запрещено|√ Внешняя реализация implements разрешена
// a.dart
interface class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // × Внешнее наследование запрещено
class Mock implements Vehicle { // √ Реализация разрешена
@override void move() {}
}
Code language: PHP (php)
abstract interface
Чистый интерфейс, наиболее часто используемый вариант
Экземпляры создавать нельзя, внешний код может только реализовывать через implements
abstract interface class Vehicle {
void move();
}
class Mock implements Vehicle {
@override void move() {}
}
Code language: PHP (php)
5. final class
√ Разрешён new|× Внешнее наследование extends запрещено|× Внешняя реализация implements запрещена
Внешнее порождение классов полностью запрещено, обеспечивает стабильность публичного 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 (запечатанный класс)
× new запрещён|× Внешние extends/implements запрещены;подклассы должны находиться в одном файле
Компилятор определяет все прямые подклассы, оператор switch требует полного перебора вариантов
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 неявно абстрактный, создание экземпляра невозможно
Code language: PHP (php)
Взаимоисключающие комбинации
sealed+abstract: sealed неявно содержит abstract, совместное использование запрещеноinterface/final/sealed+mixin: совместное использование невозможно- На одном уровне нельзя одновременно указывать base /interface/final /sealed
Class Modifiers Модификаторы классов