Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗dtOpEsSd 79 of 113 menu
◀ ▶

Объявление 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.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить