Cet exercice illlustre la notion de liaison retardée indépendamment de la notion de sous-typage.
Soit le programme suivant :
exception CrLf;; class lecture_chaine (m) = object (self) val msg = m val mutable res = "" method lire_char = let c = input_char stdin in if (c != '\n') then begin output_char stdout c; flush stdout end; String.make 1 c method private lire_chaine_aux = while true do let s = self#lire_char in if s = "\n" then raise CrLf else res <- res ^ s; done method private lire_chaine_aux2 = let s = self#lire_char in if s = "\n" then raise CrLf else begin res <- res ^ s; self#lire_chaine_aux2 end method lire_chaine = try self#lire_chaine_aux with End_of_file -> () | CrLf -> () method input = res <- ""; print_string msg; flush stdout; self#lire_chaine method get = res end;; class lecture_mdp (m) = object (self) inherit lecture_chaine m method lire_char = let c = input_char stdin in if (c != '\n') then begin output_char stdout '*'; flush stdout end; let s = " " in s.[0] <- c; s end;; let login = new lecture_chaine("Login : ");; let passwd = new lecture_mdp("Passwd : ");; login#input;; passwd#input;; print_string (login#get);;print_newline();; print_string (passwd#get);;print_newline();;