Menu
CoddyTech

Ôn tập: quản lý sở thú

Thuộc phần Lập trình hướng đối tượng trong hành trình Rust của Coddy. Bài học 48 trên 61.

challenge icon

Thử thách

Dễ

Hãy cùng xây dựng một trình quản lý sở thú, kết hợp tất cả khái niệm về đối tượng trait (trait object) bạn đã học! Bạn sẽ tạo một hệ thống có thể lưu nhiều loài vật khác nhau, mỗi loài có tiếng kêu riêng, trong cùng một bộ sưu tập và lần lượt cho chúng phát ra tiếng kêu.

Bạn sẽ sắp xếp code trong hai tệp:

  • animals.rs: Định nghĩa một trait Speak công khai với phương thức speak, nhận &self và trả về String. Sau đó, tạo ba struct công khai là Dog, Cat và Bird, mỗi struct có trường name công khai (String). Triển khai trait Speak cho từng loài vật, với tiếng kêu đặc trưng:
    • Dog cần trả về {name} says: Woof!
    • Cat cần trả về {name} says: Meow!
    • Bird cần trả về {name} says: Tweet!
  • main.rs: Đưa module animals vào và tạo một sở thú! Tạo một Vec<Box<dyn Speak>> chứa mỗi loại vật một con, sử dụng các đầu vào đã cho. Thêm chúng theo thứ tự: Dog trước, rồi đến Cat, cuối cùng là Bird. Cuối cùng, duyệt qua sở thú và in tiếng kêu của từng con vật trên một dòng riêng.

Thử thách này cho thấy sức mạnh thực sự của đối tượng trait: ba loại vật hoàn toàn khác nhau cùng sống trong một bộ sưu tập, mỗi loại đều phản hồi lời gọi speak() theo cách riêng.

Đầu ra của bạn cần hiển thị tiếng kêu của từng con vật theo thứ tự:

{dog_name} says: Woof!
{cat_name} says: Meow!
{bird_name} says: Tweet!

Ví dụ, với các đầu vào Rex, Whiskers và Tweety:

Rex says: Woof!
Whiskers says: Meow!
Tweety says: Tweet!

Bạn sẽ nhận ba đầu vào: tên chó, tên mèo và tên chim.

Tự làm thử

mod animals;

use animals::{Speak, Dog, Cat, Bird};

fn main() {
    // Đọc đầu vào là tên các con vật
    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: Tạo một Vec<Box<dyn Speak>> tên là zoo
    // Thêm các con vật theo thứ tự: Dog trước, rồi đến Cat, sau đó là Bird

    // TODO: Duyệt qua zoo và in ra tiếng kêu của từng con vật
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Rust online