

type mot = Ga | Bu | Zo | Meu
exception Y_a_plus_de_mots
class chiffre = object
val mutable mot = Ga
method ecrit =
match mot with
Ga -> "ga"
| Bu -> "bu"
| Zo -> "zo"
| Meu -> "meu"
method incremente =
mot <- match mot with
Ga -> Bu
| Bu -> Zo
| Zo -> Meu
| _ -> raise Y_a_plus_de_mots
method private reset = mot <- Ga
end
class virtual jetable = object (bibi)
val mutable poubelles = None
method private reset = ()
method private virtual cree_poubelle : #chiffre
method jette =
bibi#reset;
begin
match poubelles with
None -> let p = bibi#cree_poubelle in poubelles <- Some p; p
| Some p -> p
end#incremente
method ecrit =
match poubelles with
None -> ""
| Some p -> p#ecrit
end
class nombre = object (bibi)
inherit jetable as maman
inherit chiffre as papa
method incremente = try papa#incremente with Y_a_plus_de_mots -> bibi#jette
method ecrit = maman#ecrit ^ papa#ecrit
method cree_poubelle = new nombre
end
let shadok nombre = print_endline
(let n = new nombre in for i = 1 to nombre do n#incremente done; n#ecrit)