some unfinished work (from Thera island and later)
[svn/Cll1h/.git] / demos / objects / objects-wiki.c
CommitLineData
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 6def_type(Animal);
7
8def_mem(Actions)
097bac9a 9{
b27abb8a 10 Animal method(init) (Animal self, str name);
11 str method(talk) (Animal self);
097bac9a 12};
13
b27abb8a 14def_obj(Animal)
097bac9a 15{
b27abb8a 16 interface(Actions);
17 char *name;
18};
097bac9a 19
b27abb8a 20str cat_talk(Animal self)
097bac9a 21{
b27abb8a 22 return "Meow!";
097bac9a 23}
24
b27abb8a 25str dog_talk(Animal self)
097bac9a 26{
b27abb8a 27 return "Arf! Arf!";
097bac9a 28}
29
b27abb8a 30Animal animal_init(Animal self, str name)
097bac9a 31{
b27abb8a 32 self->name = name;
33 return self;
097bac9a 34}
35
b27abb8a 36Actions cat_actions(Actions this)
097bac9a 37{
b27abb8a 38 this->init = animal_init;
39 this->talk = cat_talk;
097bac9a 40}
41
b27abb8a 42Actions dog_actions(Actions this)
097bac9a 43{
b27abb8a 44 this->init = animal_init;
45 this->talk = dog_talk;
097bac9a 46}
47
48program
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}
This page took 0.153739 seconds and 4 git commands to generate.