b27abb8a |
1 | #include "cll1.h" |
097bac9a |
2 | |
3 | /* This is C<<1 rewrite of object polymorphism from |
4 | http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming */ |
5 | |
b27abb8a |
6 | def_type(Animal); |
7 | |
8 | def_mem(Actions) |
097bac9a |
9 | { |
b27abb8a |
10 | Animal method(init) (Animal self, str name); |
11 | str method(talk) (Animal self); |
097bac9a |
12 | }; |
13 | |
b27abb8a |
14 | def_obj(Animal) |
097bac9a |
15 | { |
b27abb8a |
16 | interface(Actions); |
17 | char *name; |
18 | }; |
097bac9a |
19 | |
b27abb8a |
20 | str cat_talk(Animal self) |
097bac9a |
21 | { |
b27abb8a |
22 | return "Meow!"; |
097bac9a |
23 | } |
24 | |
b27abb8a |
25 | str dog_talk(Animal self) |
097bac9a |
26 | { |
b27abb8a |
27 | return "Arf! Arf!"; |
097bac9a |
28 | } |
29 | |
b27abb8a |
30 | Animal animal_init(Animal self, str name) |
097bac9a |
31 | { |
b27abb8a |
32 | self->name = name; |
33 | return self; |
097bac9a |
34 | } |
35 | |
b27abb8a |
36 | Actions cat_actions(Actions this) |
097bac9a |
37 | { |
b27abb8a |
38 | this->init = animal_init; |
39 | this->talk = cat_talk; |
097bac9a |
40 | } |
41 | |
b27abb8a |
42 | Actions dog_actions(Actions this) |
097bac9a |
43 | { |
b27abb8a |
44 | this->init = animal_init; |
45 | this->talk = dog_talk; |
097bac9a |
46 | } |
47 | |
48 | program |
49 | { |
50 | int i; |
b27abb8a |
51 | Animal animal[3]; |
52 | Actions cat = cat_actions(); |
53 | Actions dog = dog_actions(); |
097bac9a |
54 | |
b27abb8a |
55 | animal[0] = init_obj(Animal, Actions, cat) |
56 | "Missy"); |
57 | animal[1] = init_obj(Animal, cat, "Mr. Bojangles"); |
58 | animal[2] = init_obj(Animal, dog, "Lassie"); |
097bac9a |
59 | |
b27abb8a |
60 | for_range(i, 0, 2) |
61 | { |
62 | printf("%s: %s\n", animal[i].name, _(talk, animal[i])); |
63 | } |
097bac9a |
64 | } |