Варианты с полями у sealed class в Dart
Подтип запечатанного класса часто объявляют как
final class с полями, если у варианта есть
данные. Такой вариант наследует запечатанный родитель,
а поля задают в конструкторе:
sealed class OrderEvent {}
final class Created extends OrderEvent {
Created(this.id);
final int id;
}
final class Paid extends OrderEvent {
Paid(this.id, this.sum);
final int id;
final double sum;
}
final class Cancelled extends OrderEvent {
const Cancelled();
}
Создадим объекты и выведем результат:
var a = Paid(1, 9.99);
var b = Paid(1, 9.99);
print(a.id == b.id && a.sum == b.sum);
Поля варианта доступны у конкретного объекта через точку. При необходимости можно создать новый объект того же класса с измененными значениями:
sealed class Profile {}
final class User extends Profile {
User(this.name, this.age);
final String name;
final int age;
}
final class Guest extends Profile {
const Guest();
}
Создадим объекты и выведем результат:
var u = User("Ann", 20);
var older = User(u.name, 21);
print(older.age);
В одной иерархии сочетают final class для вариантов
с данными и варианты без полей для одиночных состояний.
Разбор в switch остается исчерпывающим, если
перечислены все объявленные подтипы:
sealed class Download {}
final class Idle extends Download {
const Idle();
}
final class Progress extends Download {
Progress(this.percent);
final int percent;
}
final class Ready extends Download {
Ready(this.path);
final String path;
}
Вызовем функцию для нового объекта:
String label(Download d) {
switch (d) {
case Idle():
return "idle";
case Progress(:final percent):
return "$percent%";
case Ready(:final path):
return path;
}
}
print(label(Progress(40)));
Объявите sealed class Point:
Origin как final class без полей,
XY как final class с полями
x и y.
Создайте XY(2, 3), затем объект XY
с тем же x и y = 5, и выведите
координату y.
Объявите sealed class Note:
Blank как final class без полей,
Text как final class с полем
body.
Создайте два значения Text("hi"),
сравните поля body оператором ==
и выведите результат.