Абстрактный класс:
- Не может быть инстанцирован напрямую.
- Может содержать абстрактные методы (без реализации) и реализованные методы.
- Классы наследуются от абстрактного класса с помощью ключевого слова
extends.
- Класс может наследоваться только от одного класса (одиночное наследование).
Миксин:
- Не может быть инстанцирован напрямую.
- Не может иметь конструкторов.
- Может содержать реализованные методы, но не может иметь абстрактных методов (до Dart 2.1, где появились абстрактные миксины).
- Классы используют функциональность миксинов с помощью ключевого слова
with.
- Класс может использовать несколько миксинов.
- Используется для повторного использования кода и добавления функциональности классам без наследования. По сути, позволяет "подмешивать" поведение.
Пример абстрактного класса:
dart
Пример миксина:
dart
Сравнение в табличной форме:
| Признак | Абстрактный класс | Миксин |
|---|
| Инстанцирование | Нет | Нет |
| Конструктор | Может иметь | Не может иметь |
| Абстрактные методы | Может иметь | Не может иметь (до Dart 2.1) |
| Реализованные методы | Может иметь | Может иметь |
| Использование | extends | with |
| Наследование/Использование | Одиночное наследование | Множественное использование |
| Назначение | Определение общего контракта | Переиспользование кода, добавление поведения |