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)