Повторение — Менеджер зоопарка
Часть раздела Object Oriented Programming путешествия по Rust на Coddy. Урок 48 из 61.
Задание
ЛегкоДавайте создадим менеджер зоопарка, который объединит все изученные вами концепции объектов типажа (trait objects)! Вы создадите систему, в которой различные животные — каждое со своим уникальным звуком — могут храниться в одной коллекции и подавать голос по очереди.
Вы организуете свой код в двух файлах:
animals.rs: Определите публичный типажSpeakс методомspeak, который принимает&selfи возвращаетString. Затем создайте три публичные структуры —Dog,CatиBird— каждая с публичным полемname(String). Реализуйте типажSpeakдля каждого животного с их характерными звуками:- Dog должен возвращать
"{name} says: Woof!" - Cat должен возвращать
"{name} says: Meow!" - Bird должен возвращать
"{name} says: Tweet!"
- Dog должен возвращать
main.rs: Подключите модуль animals и создайте зоопарк! СоздайтеVec<Box<dyn Speak>>, содержащий по одному животному каждого типа, используя предоставленные входные данные. Добавьте их по порядку: сначала Dog, затем Cat, затем Bird. Наконец, переберите ваш зоопарк и выведите звук каждого животного на отдельной строке.
Эта задача демонстрирует реальную мощь объектов типажа — три совершенно разных типа животных живут вместе в одной коллекции, и каждое из них отвечает на один и тот же вызов speak() своим уникальным поведением.
Ваш вывод должен отображать голос каждого животного по порядку:
{dog_name} says: Woof!
{cat_name} says: Meow!
{bird_name} says: Tweet!Например, при входных данных Rex, Whiskers и Tweety:
Rex says: Woof!
Whiskers says: Meow!
Tweety says: Tweet!Вы получите три входных значения: имя собаки, имя кошки и имя птицы.
Попробуйте сами
mod animals;
use animals::{Speak, Dog, Cat, Bird};
fn main() {
// Чтение входных данных для имен животных
let mut dog_name = String::new();
std::io::stdin().read_line(&mut dog_name).expect("Failed to read line");
let dog_name = dog_name.trim().to_string();
let mut cat_name = String::new();
std::io::stdin().read_line(&mut cat_name).expect("Failed to read line");
let cat_name = cat_name.trim().to_string();
let mut bird_name = String::new();
std::io::stdin().read_line(&mut bird_name).expect("Failed to read line");
let bird_name = bird_name.trim().to_string();
// TODO: Создайте Vec<Box<dyn Speak>> с именем zoo
// Добавьте животных по порядку: сначала Dog, затем Cat, затем Bird
// TODO: Пройдите циклом по zoo и выведите звук каждого животного
}
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player9Трейт-объекты
Динамическая диспетчеризацияВекторы трейтовИтерация по трейт-объектамПовторение — Менеджер зоопаркаПотренируйтесь самостоятельно: Онлайн-компилятор Rust