| 1 | extern crate downcast; |
| 2 | |
| 3 | // we need to use downcast::Any instead of std::any::Any |
| 4 | use downcast::{downcast, Any}; |
| 5 | |
| 6 | /* Trait */ |
| 7 | |
| 8 | trait Animal: Any { |
| 9 | fn what_am_i(&self); |
| 10 | } |
| 11 | |
| 12 | downcast!(dyn Animal); |
| 13 | |
| 14 | /* Impl */ |
| 15 | |
| 16 | struct Bird; |
| 17 | |
| 18 | impl Animal for Bird { |
| 19 | fn what_am_i(&self){ |
| 20 | println!("Im a bird!" ) |
| 21 | } |
| 22 | } |
| 23 | |
| 24 | impl Bird { |
| 25 | fn wash_beak(&self) { |
| 26 | println!("Beak has been washed! What a clean beak!" ); |
| 27 | } |
| 28 | } |
| 29 | |
| 30 | /* Main */ |
| 31 | |
| 32 | fn main() { |
| 33 | let animal: Box<dyn Animal> = Box::new(Bird); |
| 34 | animal.what_am_i(); |
| 35 | { |
| 36 | let bird = animal.downcast_ref::<Bird>().unwrap(); |
| 37 | bird.wash_beak(); |
| 38 | } |
| 39 | let bird: Box<Bird> = animal.downcast::<Bird>().ok().unwrap(); |
| 40 | bird.wash_beak(); |
| 41 | } |
| 42 | |