Developpez.com - Pascal
X

Choisissez d'abord la catégorieensuite la rubrique :


Introduction à la Programmation Orientée Objets

28/06/2004

Par Hdd34 (Programmation générale)
 

Apprendre simplement la Programmation Orientée Objets


Avant Propos
1. Vue d'ensemble de la POO
1.1. L'objet
1.2. Les 3 fondamentaux de la POO
1.2.1. Encapsulation
1.2.2. Héritage
1.2.2.1. Définition
1.2.2.2. Héritage multiple


Avant Propos


Dans ce tutoriel vous apprendrez à manier la Programmation Orientée Objets, ou POO pour les intimes. Loin d'être aussi complexe qu'elle peut le laisser transparaître, la POO peut se maîtriser rapidiment au point de ne plus pouvoir s'en passer.
A opposer à la programmation dite procédurale, la programmation objet tourne autour d'une unique entité : l'objet, que je vous invite à découvrir de suite...


1. Vue d'ensemble de la POO


Avant de rentrer plus avant dans le sujet qui nous intéresse, nous allons commencer par poser un certain nombre de bases.


1.1. L'objet


Il est impossible de parler de Programmation Orientée Objets sans parler d'objet, bien entendu. Tâchons donc de donner une définition aussi complète que possible d'un objet.
Un objet est avant tout une structure de données. Autrement, il s'agit d'une entité chargée de gérer des données et de les stocker sous une certaine forme. En cela, rien ne distingue un objet d'une quelconque autre structure de données. La principale différence vient du fait que l'objet possède la faculté d'offrir une interface entre les données et le programme.

Un objet est de fait constitué de plusieurs éléments :

  • Les champs :

    Les champs sont à l'objet ce que les variables sont à un programme : ce sont eux qui ont en charge les données à gérer. Tout comme n'importe quelle autre variable, un champ peut posséder un type quelconque défini au préalable : nombre, caractère, ..., ou même un type objet.

  • Les méthodes :

    Les méthodes sont les éléments d'un objet qui servent d'interface entre les données et le programme. Sous ce nom obscur se cachent simplement des procédures ou fonctions.


Si nous résumons, un objet est donc un type servant à stocker des données dans des champs et à les gérer au travers des méthodes.
Si on se rapproche du Pascal, un objet n'est donc qu'une extension évoluée des enregistrements (type record) disposant de procédures et fonctions pour gérer les champs qu'il contient.


1.2. Les 3 fondamentaux de la POO


Les Programmation Orientée Objets est dirigée par 3 fondamentaux qu'il convient de toujours garder à l'esprit : encapsulation, héritage et polymorphisme. Houlà ! Inutile de fuir en voyant cela, car en fait, il ne cachent que des choses relativement simples. Nous allons tenter de les expliquer tout de suite.


1.2.1. Encapsulation


Derrière ce terme se cache le concept même de l'objet : réunir sous la même entité les données et les moyens de les gérer, à savoir les champs et les méthodes.
L'encapsulation introduit donc une nouvele manière de gérer des données. Il ne s'agit plus de déclarer des données générales puis un ensemble de procédures et fonctions destinées à les gérer mais bien de réunir le tout sous le couvert d'une seule et même entité : l'objet.

Sous ce nouveau concept se cache également un autre élément à prendre en compte : pouvoir masquer aux yeux d'un programmeur extérieur tous les rouages d'un objet et donc l'ensemble des procédures et fonctions destinées à la gestion interne de l'objet, auxquelles le programmeur final n'aura pas à avoir accès. L'encapsulation permet donc de masquer un certain nombre de champs et méthodes tout en laissant visible d'autres champs et méthodes. Nous verrons ceci un peu plus loin.

Pour conclure, l'encapsulation permet de garder une cohérence dans la gestion de l'objet, tout en assurant l'intégrité des données qui ne pourront être accédées qu'au travers des méthodes visibles.


1.2.2. Héritage



1.2.2.1. Définition


Si l'encapsulation pourrait se faire manuellement (grâce à la définition d'une unité par exemple), il en est tout autrement de l'héritage. Cette notion est celle qui s'explique le mieux au travers d'un exemple. Considérons un objet Bâtiment. Cet objet est pour le moins générique, et sa définition reste assez vague. On peut toutefois lui associer divers champs, dont par exemple :

  • L'adresse
  • La superficie
  • Le loyer

On peut supposer que cet objet Bâtiment dispose d'un ensemble de méthodes destinées à sa gestion. On pourrait ainsi définir entre autres des méthodes pour :

  • Ouvrir et fermer le Bâtiment
  • Payer le loyer

Grâce au concept d'héritage, cet objet Bâtiment va pouvoir donner naissance à un ou des descendants. Ces descendants vont tous bénéficier des caractéristiques propres de leur ancêtre, à savoir ses champs et méthodes. Cependant, les descendants conserve la possibilité de posséder leur propres champs et méthodes. Tout comme un enfant hérite des caractéristiques de ses parents et développe les siennes, un objet peut hériter des caractéristiques de son ancêtre et en posséder de nouvelles.

Ainsi, si l'on poursuit notre exemple, nous allons pouvoir créer un objet Maison. Ce nouvel objet est toujours considéré comme un Bâtiment, il possède donc toujours les champs Adresse ou Loyer et les méthodes destinées par exemple à Payer le loyer.
Toutefois, si notre nouvel objet est un Bâtiment, il n'en reste pas moins qu'il s'agit d'une Maison. On peut donc lui adjoindre d'autres champs et méthodes, et par exemple :

  • Nombre de pièces
  • Possède ou non un jardin

Ce processus d'héritage peut bien sûr être itéré. Autrement dit, il est tout à fait possible de déclarer à présent un descendant de Maison. Mais de la même manière, il n'y a pas de restrictions théoriques concernant le nombre de descendants pour un objet. Ainsi, pourquoi ne pas déclarer des objets Immeuble ou encore Usine dont l'ancêtre commun serait toujours Bâtiment.

Ce concept d'héritage ouvre donc la porte à un nouveau genre de programmation.


1.2.2.2. Héritage multiple



Il existe un dernier point à prendre en considération. Certains langages acceptent la Programamtion Orientée Objets à Héritage Multiple. Ceci signifie qu'un objet peut posséder plusieurs ancêtres différents, et hériter des champs et méthodes de chacun. C'est notamment le cas du langage C++. Toutefois, le Pascal standard n'autorise pas l'héritage multiple.
Il ne faut pas nécessairement voir ceci comme une limitation du langage. En effet, l'héritage multiple est souvent à réserver à des cas bien particulier et peut mener à un certain nombre de conflits notamment lorsque deux ancêtres différents possèdent des champs ou méthodes possédant les mêmes noms tout en ayant une signification et un rôle différent.

D'une manière générale, l'héritage multiple est à réserver à des cas bien particuliers. Les dernières version du Pascal, à savoir le Pascal Objet, peuvent néanmoins l'autoriser sous certaines conditions : au niveau des interfaces par exemple. Mais cela reste une exception.



Copyright (C) 2004, Eric Sigoillot
Responsables bénévoles de la rubrique Pascal : Gilles Vasseur - Alcatîz -