Объявление sealed class в Dart
Ключевое слово sealed class задает родительский тип с заранее
известным полным набором подтипов. Наследование здесь
оформляют так же, как от обычного родителя, но все потомки
объявляют в том же файле; снаружи файла новый наследник
добавить нельзя, и сам sealed class не создают
напрямую:
sealed class Result {}
final class Ok extends Result {
Ok(this.text);
final String text;
}
final class Fail extends Result {
Fail(this.message);
final String message;
}
Создадим объект и выведем его:
Result result = Ok("saved");
print(result);
Вариант без данных оформляют как final class
с пустым или константным конструктором.
Так отмечают единственное состояние вроде загрузки
или пустого результата:
sealed class LoadState {}
final class Loading extends LoadState {
const Loading();
}
final class Done extends LoadState {
Done(this.count);
final int count;
}
Создадим объект и выведем его:
LoadState state = Loading();
print(state);
Переменная запечатанного типа может хранить любой из
объявленных подтипов. Разбор по вариантам
удобно делать в switch - компилятор видит весь
список наследников:
sealed class Payment {}
final class Card extends Payment {
Card(this.last4);
final String last4;
}
final class Cash extends Payment {
Cash(this.amount);
final double amount;
}
Вызовем функцию для нового объекта:
String describe(Payment p) {
switch (p) {
case Card(:final last4):
return "card $last4";
case Cash(:final amount):
return "cash $amount";
}
}
print(describe(Card("4242")));
Объявите sealed class Answer с вариантами
Yes и No как final class
без полей.
Сохраните Yes() в переменную reply
и выведите ее.
Объявите sealed class Mail:
Inbox с полем unread,
Sent с полем total.
Создайте Inbox(3), сохраните в
box и выведите число unread.