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 | |