Повторение — Менеджер зоопарка
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 48 из 61.
Задание
ЛегкоДавайте создадим менеджер зоопарка, который объединит все изученные вами концепции объектов трейтов! Вы создадите систему, в которой разные животные, каждое со своим уникальным звуком, могут храниться в одной коллекции и говорить по очереди.
Вы организуете код в двух файлах:
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: Подключите модуль с животными и создайте зоопарк! Создайте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 и вывести звук каждого животного
}
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player9Трейт-объекты
Динамическая диспетчеризацияВекторы трейтовИтерация по трейт-объектамПовторение — Менеджер зоопаркаПотренируйтесь самостоятельно: Онлайн-компилятор Rust