L'idée sous-jacente à la base de la programmation objet, est de voir un type comme des données associées à des opérations. Cette généralisation de la notion de type est appelée une classe.
Pour vous ramener à des choses déjà connues, vous pouvez imaginer une classe comme l'association de sous-programmes à un type structuré.
Tout comme un type structuré, une classe possède des champs qui peuvent être de types quelconques. Ce sont les attributs de la classe.
La nouveauté par rapport à un type structuré est l'intégration de sous-programmes, appelés méthodes. Ils représentent les opérations de la classe.
Comme un type structuré, une classe doit en principe être déclarée avant de pouvoir être utilisée. Mais dans ce premier cours sur la programmation objet, nous nous limiterons à l'utilisation de classes prédéfinies (et donc intégrées au langage de programmation). Par conséquent, la déclaration d'une classe ne sera pas abordée dans ce cours.
Pour introduire la notion de classe, nous prendrons comme exemple la classe TStringList de Pascal, qui permet de manipuler des listes de chaines de caractères.
Cette classe possède (entre autres) deux attributs (en réalité, il s'agit de propriétés, mais cette notion ne sera abordée que dans le deuxième cours sur la programmation objet. Pour l'instant, nous allons donc considérer pour simplifier qu'il s'agit d'attributs) nommés Count et Strings et quatre méthodes nommées Clear , Add, IndexOf et LoadFromFile:
Count est un attribut de type entier destiné à contenir le nombre d'éléments de la liste.
L'attribut Strings quand à lui contient la liste des chaines de caractères.
La méthode Clear est une procédure sans paramètre qui permet de vider une liste.
La méthode Add est une procédure à un paramètre (de type String), qui permet d'ajouter une chaine de caractères à une liste.
La méthode IndexOf est une fonction à un paramètre de type String. Elle retourne la position d'une chaine de caractère dans la liste. La position de la première chaine est 0, celle de la deuxième 1, etc ... Si la chaine n'est pas dans la liste, IndexOf retourne -1.
La méthode LoadFromFile est une procédure à un paramètre de type String représentant le nom d'un fichier. Elle remplit la liste avec les lignes contenues dans ce fichier. C'est donc un moyen pratique pour initialiser la liste des chaines de caractères contenues dans un objet de la classe TStringList.
A partir du moment où une classe est définie, il est possible de créer des instances de cette classe ou autrement dit, des objets.
Par comparaison avec un type structuré, la création d'une instance peut être comparée à la déclaration d'une variable de type structuré.
Il y a pourtant une différence importante avec la déclaration d'une variable de type structuré : la déclaration d'un objet n'alloue pas d'espace mémoire pour cet objet, mais pour un pointeur sur cet objet.
Prenons un exemple. Le code suivant ressemble à la déclaration d'une variable de type TStringList:
var Mayonnaise: TStringList;
En réalité, cette ligne de code déclare l'adresse d'un objet (encore inexistant à ce stade) de la classe TStringList. Pour l'instant, cet objet n'existe pas et par conséquent, son adresse est indéfinie.
Pour créer un objet, une deuxième opération appelé instanciation est nécessaire.
En Pascal, l'instanciation se fait par l'intermédiaire d'une méthode spéciale nommée Create, définie pour toutes les classes.
Voici par exemple, l'instanciation d'un objet de la classe TStringList:
Mayonnaise := TStringList.Create ();
C'est uniquement lors de l'instanciation:
Les objets sont stockés dans le tas (heap en anglais), dont nous avons déjà parlé dans le cours consacré aux types structurés et aux pointeurs.
Lors de l'instanciation de l'objet Mayonnaise, une plage mémoire du tas est allouée à cet objet. L'adresse de cette zone est retournée par la méthode Create. Afin de pouvoir agir par la suite sur cet objet, nous avons sauvegardé cette adresse dans la variable Mayonnaise.
Mayonnaise n'est donc rien d'autre qu'un pointeur sur un objet de type TStringList.
L'accès aux attributs d'un objet se fait de la même manière que l'accès aux champs d'une structure. On utilise le nom de l'objet, suivi d'un point, suivi du nom de l'attribut.
La définition des attributs d'une classe offre toutefois des possibilités supplémentaires, que nous verrons essentiellement dans la deuxième partie du cours. Mais certaines de ces possibilités apparaissent déjà dans la classe TStringList:
Bien que les méthodes soient des sous-programmes, l'appel d'une méthode ne s'écrit pas comme l'appel d'un sous-programme.
Un des paramètres d'une méthode est forcément un objet de la classe pour laquelle cette méthode à été définie.
Par exemple, toute méthode de la classe TStringList a un paramètre de type TStringList ou autrement dit, un objet de cette classe.
Mais dans l'écriture de l'appel de la méthode, cet objet ne figurera pas dans les parenthèses, mais en dehors, à gauche du nom de la méthode et séparé par un point. Cette écriture est l'application d'une méthode à un objet.
Voici, par exemple l'application de la méthode Add (adjonction d'une chaine) à un objet de la classe TStringList:
Mayonnaise.Add('Oeuf');
Toute méthode s'applique donc nécessairement à un objet de sa classe.
Une autre différence importante avec les sous-programmes se situe au niveau du nom. Le nom d'un sous-programme normal le définit de manière unique. Ce n'est pas vrai pour une méthode.
En effet, deux classes distinctes peuvent avoir des méthodes de même nom qui ne font pas du tout la même chose !
On pourrait par exemple imaginer une classe Date avec une méthode Add permettant d'ajouter un certain nombre de jours à une date. L'application de cette méthode à un objet D de la classe Date pourrait par exemple s'écrire:
D.Add(5);
qui aurait comme effet d'ajouter cinq jours à la date D.
Mais dans ce cas, comment le compilateur peut il distinguer les deux méthodes?
L'ambiguité est résolue grâce à la nature de l'objet à laquelle est appliquée la méthode. S'il s'agit d'un objet de la classe TStringList, le compilateur en déduira qu'il s'agit de la méthode Add de la classe TStringList. S'il s'agit d'un objet de la classe Date, il en déduira qu'il s'agit de la méthode Add de la classe Date.