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

Варианты с полями у 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 оператором == и выведите результат.

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