extern crate downcast; | |
// we need to use downcast::Any instead of std::any::Any | |
use downcast::{downcast, Any}; | |
/* Trait */ | |
trait Animal: Any { | |
fn what_am_i(&self); | |
} | |
downcast!(dyn Animal); | |
/* Impl */ | |
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!"); | |
} | |
} | |
/* Main */ | |
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(); | |
} |