Ответ
Redirecting constructor (перенаправляющий конструктор) в Dart — это конструктор, который не имеет собственного тела и списка инициализаторов, а лишь перенаправляет вызов на другой конструктор того же класса с помощью синтаксиса : this(...). Это позволяет создавать удобные фабричные методы или альтернативные способы инстанцирования объекта без дублирования кода.
Синтаксис и пример:
class Rectangle {
final double width;
final double height;
final String label;
// Основной конструктор
Rectangle(this.width, this.height, [this.label = 'Rectangle']);
// Redirecting конструктор для создания квадрата.
// Он просто вызывает основной конструктор, подставляя height = width.
Rectangle.square(double sideLength) : this(sideLength, sideLength, 'Square');
// Ещё один redirecting конструктор с преобразованием параметров.
Rectangle.fromMap(Map<String, double> dimensions)
: this(dimensions['width'] ?? 0.0, dimensions['height'] ?? 0.0);
}
void main() {
final rect = Rectangle(10, 20);
final square = Rectangle.square(15); // Вызовет Rectangle(15, 15, 'Square')
final fromMap = Rectangle.fromMap({'width': 5, 'height': 7});
}
Ключевые особенности:
- Нет тела: После двоеточия (
:) может быть только вызовthis(...). - Нет initializer list: Нельзя использовать
: width = 10, height = 20. - Цель — избежать дублирования: Вся логика инициализации сосредоточена в основном конструкторе.
- Удобство для API: Позволяет предоставить пользователю класса более интуитивно понятные имена методов создания (например,
Point.polar(radius, angle)).