Повторение — Пользовательская коллекция
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 75 из 110.
Задание
ЛегкоДавайте создадим систему ScoreBoard, которая отслеживает очки игроков и демонстрирует, как специальные методы работают вместе для создания отточенного, профессионального класса!
Вы организуете свой код в двух файлах:
score_board.dart: Создайте классPlayerи классScoreBoard, которые работают вместе для управления игровыми очками.Ваш класс
Playerдолжен иметьname(String) иscore(int). Ему необходимо:- Реализовать
Comparable<Player>, чтобы игроков можно было сортировать по количеству очков в порядке убывания (сначала самые высокие) - Переопределить
==иhashCode, чтобы два игрока с одинаковым именем считались равными (независимо от количества очков) - Переопределить
toString(), чтобы он возвращал:[name]: [score] points
Ваш класс
ScoreBoardдолжен хранить список игроков и предоставлять:- Метод
addPlayer(Player player), который добавляет игрока только в том случае, если он еще не существует (используйте вашу реализацию равенства!) - Метод
call(), который не принимает аргументов и возвращает отсортированную копию списка игроков (отсортированную по очкам, сначала самые высокие) - Переопределить
toString()для отображения всех игроков (неотсортированных), по одному в строке, с заголовкомScoreBoard:в первой строке
- Реализовать
main.dart: Импортируйте файл таблицы очков и продемонстрируйте, как все эти специальные методы работают вместе:- Создайте
ScoreBoard - Добавьте этих игроков:
Aliceс150,Bobс200,Charlieс175 - Попробуйте снова добавить
Aliceс очками999(она должна быть отклонена как дубликат) - Распечатайте таблицу очков, используя её
toString() - Распечатайте пустую строку
- Распечатайте
Rankings: - Вызовите таблицу очков как функцию, чтобы получить отсортированный рейтинг, а затем распечатайте каждого игрока
- Создайте
Этот челлендж объединяет toString() для отображения, == и hashCode для обнаружения дубликатов, compareTo() для сортировки и call() для чистого интерфейса вызова!
Ожидаемый вывод:
ScoreBoard:
Alice: 150 points
Bob: 200 points
Charlie: 175 points
Rankings:
Bob: 200 points
Charlie: 175 points
Alice: 150 pointsПопробуйте сами
import 'score_board.dart';
void main() {
// TODO: Создайте ScoreBoard
// TODO: Добавьте игроков: Alice (150), Bob (200), Charlie (175)
// TODO: Попробуйте снова добавить Alice со счетом 999 (должно быть отклонено как дубликат)
// TODO: Выведите таблицу лидеров, используя её toString()
// TODO: Выведите пустую строку
// TODO: Выведите "Rankings:"
// TODO: Вызовите таблицу лидеров как функцию, чтобы получить отсортированный рейтинг, затем выведите каждого игрока
}
Все уроки раздела Объектно-ориентированное программирование
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
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий