33Fermer35
SallyLe 30/01/2004 à 22:50
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 cheeky)
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 smile

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)