Menu
Coddy logo textTech

Повторение — Менеджер зоопарка

Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 48 из 61.

challenge icon

Задание

Легко

Давайте создадим менеджер зоопарка, который объединит все изученные вами концепции объектов типажа (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!"
  • 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