Ô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.
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 traitSpeakcông khai với phương thứcspeak, nhận&selfvà trả vềString. Sau đó, tạo ba struct công khai làDog,CatvàBird, mỗi struct có trườngnamecông khai (String). Triển khai traitSpeakcho từng loài vật, với tiếng kêu đặc trưng:Dogcần trả về{name} says: Woof!Catcần trả về{name} says: Meow!Birdcần trả về{name} says: Tweet!
main.rs: Đưa module animals vào và tạo một sở thú! Tạo mộtVec<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ự:Dogtrước, rồi đếnCat, 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
1Phương thức và hành vi
Nhập môn khối triển khaiTham số selfPhương thức có thể thay đổiHàm liên kếtNhiều khối triển khaiNối chuỗi phương thứcÔn tập: thao tác với hình chữ nhật4Dự án: Thú cưng ảo
Định nghĩa thú cưngCho thú cưng ăn7Các trait tiêu chuẩn
Trait DebugTrait DisplayClone và CopyCác trait so sánh bằngÔn tập: Điểm có thể in ra2Tính đóng gói và module
Kiến thức cơ bản về moduleTừ khóa publicTrường riêng tưHàm lấy giá trịHàm thiết lập giá trịÔn tập: tủ khóa an toàn5Kiểu tổng quát
Cấu trúc tổng quátPhương thức tổng quátNhiều kiểu tổng quátHàm tổng quátÔn tập: điểm tọa độTự luyện tập: Trình biên dịch Rust online