extern crate downcast;
use downcast::{downcast, Any};
trait Animal: Any {
fn what_am_i(&self);
}
downcast!(dyn Animal);
struct Bird;
impl Animal for Bird {
fn what_am_i(&self){
println!("Im a bird!")
}
}
impl Bird {
fn wash_beak(&self) {
println!("Beak has been washed! What a clean beak!");
}
}
fn main() {
let animal: Box<dyn Animal> = Box::new(Bird);
animal.what_am_i();
{
let bird = animal.downcast_ref::<Bird>().unwrap();
bird.wash_beak();
}
let bird: Box<Bird> = animal.downcast::<Bird>().ok().unwrap();
bird.wash_beak();
}