Class Modifiers Модификаторы классов

Управление правами наследования, реализации и создания экземпляров классов из внешних библиотек, ограничение тел типов

Порядок модификаторов [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)

Взаимоисключающие комбинации

  1. sealed + abstract: sealed неявно содержит abstract, совместное использование запрещено
  2. interface/final/sealed + mixin: совместное использование невозможно
  3. На одном уровне нельзя одновременно указывать base /interface/final /sealed

Class Modifiers Модификаторы классов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *