Loading s5obj_lang_labo_4...

enib_small.png S5-OBJ_Lang Labo_4 — Interfaces et Polymorphisme dynamique

À l'issue de cette séance, vous devrez être capables de :

Dans le laboratoire précédent, nous avons créé une première bibliothèque de traitement d'images.
Elle comporte actuellement un processeur d'images ImageProcessor, composé d'un unique filtre : GrayFilter.

Cette situation soulève plusieurs questions :

Pour répondre à ces questions, nous allons faire évoluer notre conception.
Nous découvrirons que des objets de types différents peuvent parfois être manipulés de la même manière grâce à une abstraction commune.
Cette idée est au cœur du polymorphisme dynamique et joue un rôle central en programmation orientée objet.
{1 #invertfilter } Inverser les couleurs : InvertFilter
{2} Plusieurs filtres pour ImageProcessor
{3} Composition à multiplicité *
{4} Abstraction commune
{5} Définir une interface
{6} Implémenter une interface
{7} Modifier la classe ImageProcessor
{8} Limites de notre implémentation
{9} Complément : comment fonctionne le polymorphisme dynamique ?
{10 #heritage } Complément : l'héritage
{11 #rust_poly } Comparaison avec Rust

Code C# obtenu à l'issue de ce laboratoire.
Program.cs
Filters.cs
ImageProcessor.cs

À retenir.
Ce laboratoire a montré comment plusieurs classes peuvent collaborer à travers une abstraction commune.

Abstraction et polymorphisme
Des classes différentes peuvent représenter une même idée.
Dans notre application : GrayFilter et InvertFilter représentent tous un filtre capable de traiter une image.
Le polymorphisme dynamique permet de manipuler ces objets à travers une même abstraction sans connaître leur type exact.

Interfaces
Une interface décrit un comportement commun.
Elle indique les services qu'un objet doit fournir sans imposer son implémentation ni les données qu'il contient.
Les interfaces sont aujourd'hui largement utilisées pour représenter des abstractions et permettre le polymorphisme dynamique.

Composition à multiplicité *
Un objet peut être composé de plusieurs composants.
Dans notre application, un ImageProcessor contient une collection de filtres.
L'ordre dans lequel les composants sont stockés peut avoir une influence sur le comportement global de l'objet.

UML et programmation
Les relations décrites dans un diagramme UML représentent une intention de conception.
Le programmeur doit ensuite utiliser les mécanismes du langage pour les implémenter.

Dans un langage comme C#, plusieurs références peuvent désigner le même objet.
Pour cette raison, certaines propriétés de la composition, notamment le non-partage des composants, sont parfois difficiles à garantir strictement.
Le programmeur doit donc rester attentif aux hypothèses de conception sur lesquelles repose son application.

Comparaison entre langages
Les concepts de la programmation orientée objet restent les mêmes d'un langage à l'autre.
En revanche, chaque langage propose des mécanismes différents pour les exprimer et en garantir les propriétés.
Il est donc important de distinguer les concepts de leur mise en œuvre.