2

Table des matières

1 Introduction 5

1.1 Pourquoi la programmation à objets ? . . . . . . . . . . . . . . . . . . . . . 5 1.1.1 Modularité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.1.2 Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.1.3 Un test de modularité . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.2 La programmation à objets : un style de programmation . . . . . . . . . . . 7 1.3 Qu’est qu’un objet ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.3.1 Les deux approches . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.4 Objets et Classes avec des enregistrements extensibles . . . . . . . . . . . . . 10

1.4.1 Objets et Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.4.2 Héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.4.3 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.5 Les notions délicates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.5.1 Self et liaison tardive . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.5.2 Méthodes binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.5.3 Sélection multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.6 Typage et sous-typage : une nécessité, des difficultés . . . . . . . . . . . . . 16

1.6.1 Héritage Multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.7 Simulation des enregistrements extensibles en ML . . . . . . . . . . . . . . . 18

2 Objective ML 21

2.1 Introduction à Objective Caml . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.1.1 Classes et objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.1.2 Héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.1.3 Auto-référence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.1.4 Style impératif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.1.5 Classes paramétriques . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.1.6 Coercion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.1.7 Méthodes virtuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.1.8 Variables d’instance privées . . . . . . . . . . . . . . . . . . . . . . . 28

2.2 Génération automatique de types . . . . . . . . . . . . . . . . . . . . . . . . 29 3 Les Objets 31

3.1 Un contre-exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.2 Les objets en Objective Caml . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3.2.1 Le noyau Caml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.2.2 Extension de la syntaxe pour les objets . . . . . . . . . . . . . . . . . 35 3.2.3 Typage des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.2.4 Sémantique des objets . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.2.5 Redéfinition des champs . . . . . . . . . . . . . . . . . . . . . . . . . 36

3.3 Types récursifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.3.1 Pourquoi ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.3.2 Comment ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3.4 Sous-typage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.4.1 Pourquoi ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.4.2 Comment ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.4.3 Coercions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

4 Les Classes 41

4.1 Les classes en Objective Caml . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.1.1 Syntaxe des classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.1.2 Typage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.1.3 Sémantique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.1.4 Oublis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

4.2 L’héritage n’est pas du sous-typage . . . . . . . . . . . . . . . . . . . . . . . 45 4.3 Pré-méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.4 Liaison tardive et typage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.5 Création des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.6 Héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

4.6.1 Héritage simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.6.2 Héritage multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

4.7 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.8 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

A Correction des exercices 53