Итоги: Обобщенное хранилище
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 69 из 110.
Задание
ЛегкоДавайте создадим универсальную систему хранения, которая объединит все, что вы узнали о коллекциях и дженериках! Вы создадите класс Storage<T>, который может хранить элементы любого типа, извлекать их и поддерживать итерацию с помощью цикла for-in.
Вы организуете свой код в двух файлах:
storage.dart: Создайте свою универсальную систему хранения с двумя классами:- Класс
StorageIterator<T>, который реализуетIterator<T>для обеспечения итерации по сохраненным элементам - Класс
Storage<T>, который расширяетIterable<T>со следующими возможностями:- Приватный список для внутреннего хранения элементов
- Метод
add(T item)для сохранения нового элемента - Метод
getAt(int index), который возвращает элемент по заданному индексу - Геттер
count, который возвращает количество сохраненных элементов - Геттер
iterator, который возвращаетStorageIteratorдля сохраненных элементов
- Класс
main.dart: Импортируйте файл хранилища и продемонстрируйте работу универсального хранилища с различными типами:- Создайте
Storage<String>и добавьте три названия городов:'Paris','Tokyo','Sydney' - Выведите количество элементов
- Выведите элемент по индексу 1
- Используйте цикл
for-in, чтобы вывести каждый город на отдельной строке - Выведите пустую строку
- Создайте
Storage<int>и добавьте четыре числа:100,200,300,400 - Используйте метод
where, чтобы отфильтровать значения больше 150, затем выведите результирующий список
- Создайте
Ваша система хранения должна бесперебойно работать с любым типом, сохраняя при этом полную типизацию. Поскольку она расширяет Iterable, она автоматически получает доступ к таким мощным методам, как where, map и fold!
Ожидаемый вывод:
Count: 3
Item at 1: Tokyo
Paris
Tokyo
Sydney
[200, 300, 400]Попробуйте сами
import 'storage.dart';
void main() {
// TODO: Создайте Storage<String> для городов
// Добавьте три города: 'Paris', 'Tokyo', 'Sydney'
// TODO: Выведите количество элементов (формат: "Count: X")
// TODO: Выведите элемент по индексу 1 (формат: "Item at 1: X")
// TODO: Используйте цикл for-in, чтобы вывести каждый город на отдельной строке
// TODO: Выведите пустую строку
print('');
// TODO: Создайте Storage<int> для чисел
// Добавьте четыре числа: 100, 200, 300, 400
// TODO: Используйте метод where, чтобы отфильтровать значения больше 150
// Затем выведите результирующий список, используя toList()
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий