13- Programmation orientée objets

La programmation orientée objets repose sur 3 notions : l'encapsulation, l'héritage et le polymorphisme.

Encapsulation

Données, procédures et fonctions peuvent être regroupées dans un type nouveau appelé Object. Cette structure est proche de celle d'enregistrement, elle ajoute simplement les procédures et fonctions (qu'on appelle alors méthodes) permettant de gérer les champs de l'enregistrement.

Programmation structurée    Programmation orientée objets
TRecord = Record            TObjet = Object
           Variable1;                 Variable1;
           Variable2;                 Variable2;
           Variable3;                 Variable3;
          End;                        Procedure proc1;			
                                      Procedure proc2;
                                      Function fonc1;
                                      Function fonc2;
                                     End;

L'appel des méthodes d'un objet a lieu comme l'accès aux champs d'un enregistrement :

NomVariable.NomProc.

Héritage

Il est possible de créer un nouveau type d'objet en prenant comme modèle un type objet déjà existant. Le nouvel objet possèdera (héritera) les mêmes champs et les mêmes méthodes que son modèle, avec toutefois la possibilité d'ajouter des nouveaux champs, d'ajouter des nouvelles méthodes ou de redéfinir les méthodes existantes. On dira que le nouvel objet est un objet dérivé ou un descendant de l'ancien.

Cette notion d'héritage permet de ne pas avoir à réécrire des méthodes déjà écrites. D'autre part les corrections ou modifications du code pourront être réalisées plus rapidement et de façon plus sûre.

Polymorphisme

La notion de polymorphisme permet à une méthode commune à plusieurs objets descendants d'un même 'ancêtre' de fonctionner différemment selon l'objet qui l'appelle. De telles méthodes sont dites virtuelles.

Un objet qui contient des méthodes virtuelles doit être initialisé avec une méthode spéciale appelée constructeur; il s'agit d'une procédure déclarée avec le mot Constructor à la place du mot Procedure. Le simple fait d'écrire le mot Constructor indique à Turbo Pascal qu'il doit créer une table des méthodes virtuelles. Les appels des méthodes virtuelles se font par l'intermédiaire de cette table, c'est ainsi que le mécanisme du polymorphisme est possible.

Lorsqu'on désire libérer la mémoire occupée par un objet, il faut libérer la place occupée par la table des méthodes virtuelles. Il suffit pour cela de faire appel à une nouvelle méthode spéciale appelée destructeur; il s'agit d'une procédure déclarée avec le mot clé Destructor à la place du mot Procedure.

Tout ce processus est transparent pour le programmeur. Son rôle se réduit à la déclaration d'un constructeur (Constructor) qui doit être appelé avant tout autre méthode, puis de faire suivre la déclaration des méthodes virtuelles par le mot clé Virtual, et enfin d'appeler le destructeur au moment de la libération de la mémoire occupée.

Syntaxe étendue de New et Dispose.

Les variables de type objet sont souvent utilisées par l'intermédiaire de pointeurs. Il faut donc leur allouer de la mémoire du tas en utilisant la procédure New, puis libérer cette mémoire en utilisant la procédure Dispose. Lorsque la variable possède un constructeur et un destructeur, les procédures New et Dispose auront une syntaxe spéciale. L'appel de New permettra d'allouer la mémoire nécessaire et d'appeler le constructeur en même temps. L'appel de Dispose permettra de libérer la mémoire utilisée et d'appeler le destructeur en même temps.

Par exemple : on a déclaré un type TObjet qui contient un constructeur Init et un destructeur Done. D'autre part le type PObjet est un type pointeur sur le type TObjet. Enfin PtVarObj est une variable de type PObjet, donc un pointeur sur un objet de type TObjet.

Pour initialiser PtVarObj, on écrira : PtVarObj:=New(PObjet,Init);

Pour libérer la mémoire utilisée, on écrira : dispose(PtVarObj,Done);


Chapitre précédent