Concepts fondamentaux de La P.O.O
Le lecteur qui connaît déjà les fondements de ce chapitre peut l'ignorer et passer au chapitre suivant. Dans le cas contraire, la programmation en C# étant uniquement fondée sur le concept d'objets, ce chapitre doit être lu obligatoirement avant de continuer le cours sur C#.
Cette manière de concevoir
les programmes reste proche des machines de Von Neuman et consiste en dernier
ressort à traiter indépendamment les données et les algorithmes
(traduits par des procédures) sans tenir compte des relations qui
les lient.
En introduisant la notion de modularité dans la programmation structurée descendante, l’approche diffère légèrement de l’approche habituelle de la programmation algorithmique classique. Nous avons défini des machines abstraites qui ont une autonomie relative et qui possèdent leurs propres structures de données; la conception d’un programme relevait dès lors essentiellement de la description des interactions que ces machines ont entre elles.
La programmation orientée
objet relève d'une conception ascendante définie comme des "messages"
échangés par des entité de base appelées objets.
comparaison des deux topologies de programmation
Les langages objets sont fondés
sur la connaissance d’une seule catégorie d’entité informatique
: l’objet. Dans un objet, traditionnellement ce sont les données qui
deviennent prépondérantes. On se pose d’abord la question :
"de quoi parle-t-on ?" et non pas la question "que veut-on faire ?", comme
en programmation algorithmique. C’est en ce sens que les machines abstraites
de la programmation structurée modulaire peuvent être considérées
comme des pré-objets. En fait la notion de TAD est utilisée
dans cet ouvrage comme spécification d’un objet, en ce sens nous nous
préoccupons essentiellement des services offerts par un objet indépendamment
de sa structure interne.
Programmation
structurée :
Concepts fondamentaux de La P.O.O
Nous écrirons P.O.O
pour : programmation orientée objet.
Voici trois concepts qui donnent
toute sa puissance à la P.O.O.
|
Un module représente un objet ou une classe d’objet de l’espace du problème et non une étape principale du processus total, comme en programmation descendante. |
Recenser les objets du monde réel
Lors de l’analyse du problème,
faire l’état de l’existant en recensant les objets du monde réel.
On établit des classes d’objets et pour chaque objet on inventorie
les connaissances que l’on a sur lui :
Exemple :
Les objets rassemblent une
partie de la connaissance totale portant sur le problème. Cette connaissance
est répartie sur tous les objets sous forme déclarative ou
procédurale.
Les objets sont décrits
selon le modèle des structures abstraites de données (TAD) :
ils constituent des boîtes noires dissimulant leur implantation avec
une interface publique pour les autres objets. Les interactions s’établissant
à travers cette interface.
Un objet :
Encapsulation
c’est le fait de réunir à l'intérieur d'une même entité (objet) le code (méthodes) + données (champs). Il est donc possible de masquer les informations d'un objet aux autres objets. les champs et les méthodes masqués sont dans la partie privée de l’objet. Public les champs et les méthodes visibles sont dans la partie interface de l’objet. |
Postulons une analogie entre les
objets matériels de la vie courante et les objets informatiques. Un
objet de tous les jours est souvent obtenu à partir d’un moule industriel
servant de modèle pour en fabriquer des milliers. Il en est de même
pour les objets informatiques.
Définition
Une classe est une sorte de moule ou de matrice à partir duquel sont engendrés les objets réels qui s’appellent des instances de la classe considérée. |
Remarque
En POO, programmer revient donc à décrire des classes d’objets, à caractériser leur structure et leur comportement, puis à instancier ces classes pour créer des objets réels. Un objet réel est matérialisé dans l’ordinateur par une zone de mémoire que les données et son code occupent. |
Les attributs de la classe décrivent la structure de ses instances (les objets). Les méthodes décrivent les opérations qui sont applicables aux instances de la classe. |
Un exemple : les étudiants
Supposons que chaque étudiant soit caractérisé par sa note en mathématiques (NoteMath) et sa note en informatique (NoteInfo). Un étudiant doit pouvoir effectuer éventuellement des opérations de calcul de ses moyennes dans ces deux matières (MoyMath, MoyInfo)et connaître sa moyenne générale calculée à partir de ces deux notes (MoyTotale).
La classe Etudiant a été créée. Elle ne possède que les attributs NoteMath et NoteInfo. Les méthodes de cette classe sont par exemple MoyMath, MoyInfo, MoyTotale. Nous avons créé deux objets étudiants (deux instances : Julien et Claudie) de la classe Etudiant. |
Dans un LOO (langage orienté
objet), il existe une particularité dans la façon d’organiser
ses classes : l’héritage de propriétés. L’objectif est
de construire de nouvelles classes en réutilisant
des attributs et des méthodes de classes déjà existantes.
C’est un mécanisme très puissant qui permet de décrire des structures génériques en transmettant depuis l’intérieur d’une même classe toutes les propriétés communes à toutes les " sous-classes " de cette classe. Par construction toutes les sous-classes d’une même classe possèdent toutes les attributs et les méthodes de leur classe parent. |
|
Propriétés
générales et pratiques de l'héritage :
|
La classe " Etudiant premier cycle" héritant de la classe Etudiant
Tout se passe comme si toute la classe Etudiant était recopiée dans la sous-classe Etudiant premier cycle (même si l’implémentation n’est pas faite ainsi). La nouvelle classe dispose d’un attribut supplémentaire (Mention) et d’une méthode supplémentaire (EvaluerMention). |
Voici en Delphi (à
titre indicatif) une implantation possible de ces deux classes :
type
Tmention=(Passable,Abien,Bien,Tbien);
Etudiant = class NoteInfo : real; procedure MoyMath(UneNote:real); procedure MoyInfo(UneNote:real); function MoyTotale : real ; Etudiant1erCycle = class(Etudiant) function EvaluerMention: Tmention; |
Voici en C# (à
titre indicatif) une implantation possible de ces deux classes :
class Etudiant
{ public float NoteMath(){.....} public float NoteInfo(){.....} public void MoyMath(float UneNote){ ... } public void MoyInfo(float UneNote){ ... } public float MoyTotale(){ ... } }// fin classe Etudiant public class
Etudiant1erCycle : Etudiant { |
Structures mathématiques :
Héritage de figures en géométrie affine :
Héritage d'objets graphiques dans un système multi-fenêtré fictif :