52

Annexe A

Correction des exercices

Exercice 2, page 24

L’objet p lui-même.

Exercice 3, page 25

    class copy () as moi m^^eame =
      method copy = Oo.copy moi m^^eame
    end;;
    class copy (unit) : 'a = method copy : 'a end

Cet exemple n’est guère intéressant car la fonction copy peut toujours être utilisée à la place d’un objet. Par contre si l’objet a un état interne, une copie profonde devra répercuter la copie sur les variables d’instances.

Exercice 4, page 25

On utilise la construction {⟨ ⟩}. Par exemple, on peut réécrire la classe précédente :

    class copy () =
      method copy = {⟨ ⟩}
    end;;
    class copy (unit) : 'a = method copy : 'a end

Si dans une sous-classe, une variable d’instance est un objet qui doit également être dupliqué, on pourra re-définir la méthode copy :

    class deep copy x as self =
      inherits copy () as super
      val x = x
      method local copy = {⟨ x = x#copy ⟩}
      method copy = (super#copy)#local copy

The use local copy permits inheritance of the super#copy method, that will do a possibly deep copy in the superclass, and the later application of the local copy. The is not quite efficient since the objet will be dupplicated as many times as the number of parent classes. In this case the imperative style may be preferable. See the one after next exercise.

Another practical simple situtation is illustrated by vectors in the state.

    class vector f n =
      val m =
        let v = Vect.create (f k) p in
        for i = 0 to p−1 do v.(i) ← f i done; v
      method deep copy = {⟨ m = Vect.copy m ⟩}
    end;;