Повторение — Менеджер зоопарка
Часть раздела 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Трейт-объекты
Динамическая диспетчеризацияВекторы трейтовИтерация по трейт-объектамПовторение — Менеджер зоопарка