trait AnimalTrait {
fn speak(&self);
}
struct Animal;
impl AnimalTrait for Animal {
fn speak(&self) {
println!("I'm an animal.");
}
}
struct Dog;
impl AnimalTrait for Dog {
fn speak(&self) {
println!("I'm a dog, woof!");
}
fn bark(&self) {
println!("Woof woof!");
}
}
fn process_animals(animals: Vec<Box<dyn AnimalTrait>>) {
for animal in animals {
if let Some(dog) = animal.downcast_ref::<Dog>() {
dog.bark();
} else {
animal.speak();
}
}
}
fn main() {
let mut animals: Vec<Box<dyn AnimalTrait>> = Vec::new();
animals.push(Box::new(Animal));
animals.push(Box::new(Dog));
process_animals(animals);
}