Ceci dit, l'exemple de Nil est donné avec une syntaxe moche mais on peut faire de l'orienté objet avec une syntaxe jolie ^^
Par exemple :
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 private cree_poubelle = new nombre
end
(En l'occurence ce code ne sert pas à grand-chose, mais c'est pour montrer la syntaxe

)
Tu vois, donc là ça définit une classe nombre, qui a à la fois les propriétés d'un chiffre et celles d'un objet jetable. Pour s'incrémenter il essaye la méthode du chiffre (qui est son papa), mais si ça rate (parce qu'il n'y a plus de mots), il se jette à la poubelle (il sait le faire, il a hérité la méthode de sa maman : il lui suffit de créer une poubelle -- c'est-à-dire en fait un autre nombre -- et de se réinitialiser. Pour se réinitialiser, il utilise la méthode de son papa plutôt que celle de sa maman car il a hérité de son papa en dernier.)
Et pour écrire sa valeur (en shadok), il écrit d'abord la valeur de sa maman (c'est à dire son nombre de poubelles), puis celle de son papa (le chiffre).
Voilà, c'est tout simple comme tu peux constater
Et grâce à ça on peut écrire une fonction qui écrit n'importe quel nombre en shadok :
let shadok nombre = print_endline
(let n = new nombre in for i = 1 to nombre do n#incremente done; n#ecrit)