Programmation par Objets (1)
• Caractérisée par la programmation avec des
objets, messages, et hiérarchies des objets.
Programmation par Objets • La PO est une abstraction, généralisation de la
Programmation impérative (PI):
– P.I implique un état et un ensemble d ’opérations
Nabil Hameurlain transformant l ’état;
LIN2 – P.O implique une collection d ’objets, chacun
avec un état et un ensemble d ’opérations
transformant l ’état.
1 2
Programmation par Objets(2) Programmation par Objets(3)
• S ’intéresse beaucoup plus aux données • Programmer en Objets signifie développer
qu’au contrôle. des abstractions qui modélisent le problème
à résoudre:
• Utilise la métaphore de communication par – se focaliser sur les données, les objets, et les
opérations nécessaires pour satisfaire une tâche
messages pour capturer les interactions
particulière.
entre objets.
• Un objet peut être vu comme un Serveur:
nécessite des opérations et (parfois) des
3
données. 4
Programmation VS langages à
Langage à Objets (1)
Objets
• On peut faire de la programmation à Objets dans • Un Objet renferme son état et ses opérations
n ’importe quel langage de programmation. (encapsulation):
– cache les détails de l ’implémentation d ’un
objet.
• Un langage à objets offre des mécanismes qui
facilitent la programmation par objets • Différents objets receveurs d ’un même
(mécanismes d’encapsulation, de classification, message peuvent répondre différemment
d ’héritage, etc). (polymorhisme).
5 6
Langage à Objets (2)
Historique: approche procédurale
• Le code à exécuter en réponse à un message Modules
est déterminé dynamiquement (liaison
différée); Données
• Les objets sont crées à partir d’un moule
(classe);
• Une classe peut être construite par héritage
d’une autre classe déjà existante.
Sous-programme
– La sous-classe peut hériter de la structure et du
comportement de sa super-classe.
7 8
Historique: approche orientée
Historique: Objets
objets
• Programmation dirigée par les données et
les traitements:
– la tâche à réaliser est décomposée en un
ensemble d’objets.
• Idée : diviser (en sous-programmes
autonomes) pour mieux faire évoluer et
réutiliser
Objet = données + traitements
9 10
Terminologie (2)
Terminologie (1)
• Méthode: le corps d ’une procédure qui
• Objet: collection de données privés et des implémente une opération;
opérations publics; • Message: appel de procédure. Requête
• Classe: description d ’un ensemble d ’objets d ’exécuter une méthode;
(type encapsulé: partionner en privé et • Héritage: Extension d’une classe précédemment
public); définie;
• Instance: une instance d ’une classe est un • Sous-typage (principe) : il peut apparaître si un
objet de cette classe; objet d ’un supertype est attendu:
– c’est un mécanisme d ’héritage qui distingue entre
11 les types et les classes 12
Les Objets (1) Les Objets (2)
• Collection d ’opérations partageant un état; • Les variables représentant l ’état interne d ’un
objet sont appelées des instances de variables,
• Les opérations déterminent les messages et les opérations sont appelées des méthodes;
(appels) auxquels l ’objet peut répondre;
• La collection de méthodes d ’un objet
• L ’état partagé est caché depuis le monde détermine son interface et son comportement
extérieur, et est accessible seulement aux
opérations de l ’objet;
13 14
Types d ’Objets Objets Fonctionnels
• Objets Fonctionnels: collection de fonctions • Ils sont comme les valeurs, ayant une sorte
mais n’ayant pas d ’état; d ’interface objet, mais aucune identité
• Objets Impératifs: Objets ayant un état que persiste entre les changements d ’état.
l ’on peut mettre à jour; • Utilisés dans les langages fonctionnels et
• Objets Actifs: peuvent être activés quand un logique.
message arrive; contrairement aux Objets • Syntaxiquement, ils peuvent être représentées
fonctionnels et impératifs qui sont passifs, à par exemple par :
name: object
moins qu’ils sont activés par un message methods
….
15 16
Objets Impératifs Objets Actifs
• Les Objets Actifs ont trois modes:
• Sont comme les variables, ayant un état que – quand il y a rien à faire, ils dorment;
l ’on peut mettre à jour (Simula, Smalltalk, – quand un objet (« agent » ) est en train de
C++); s ’exécuter il est actif;
• Ont une identité, et une collection de: – et quand un objet est en attente d ’une ressource
– méthodes qui sont activées par la réception de ou l ’accomplissement des tâches il est en attente.
messages depuis les autres objets • Les messages envoyés à l ’objet doivent
– Instances de variables qui sont partagées par les attendre dans une file jusqu’à ce que l ’objet
méthodes de l ’objet, mais inaccessibles par les finisse sa tâche:
autres Objets.
– L ’envoie peut être synchrone ou asynchrone.
17 18
Les classes(1)
Implémentation d’un Objet
• Les classes servent de moule à partir duquel
les Objets peuvent être crées.
Instance data Shared methods code
methods method1 • Les classe ont les mêmes instances de
variables et d ’opérations que les objets
data field1 ...
correspondant mais l ’interprétation diffère:
…. methodn – Une instance de variable dans l ’objet représente
data fieldn les variables actuelles, alors que les instances de
variables d ’une classe sont potentielles, étant
instanciées à la création d ’un objet.
19 20
Les classes(2) Approches de définition de
L ’héritage
• Logique: exprimé par un prédicat, A(x) est
• On peut penser d ’une classe comme la vraie si x ∈ A. B hérite de A ssi,
spécification du comportement commun à tous
les objets de la classe.
∀ x, si A(x) alors B(x).
• Ensembliste: le prédicat est exprimé par une
• les opérations publics d ’une classe déterminent
inclusion d ’ensembles. B hérite de A ssi,
le comportement,
• Les instances de variables spécifient une
∀ x, si x ∈ A alors x ∈ B.
structure (de données) pour réaliser ce • Conceptuelle: exprimée par une spécialisation.
comportement; B hérite de A ssi B « est une sorte de » A.
21 22
L ’héritage (1) L ’héritage (2)
• Permet la réutilisation du comportement d ’une • Permet la classification des classes de la
classe dans la définition de la nouvelle classe. même façon que les classes permettent la
• La sous-classe hérite des opérations de la classification des valeurs (premier niveau).
classe parente (super classe) et peut rajouter de – Offre un pouvoir de modélisation conceptuelle et
de classification (du second ordre).
nouvelles opérations et de nouvelles instances
de variables. • Offre la possibilité de gérer, de manipuler, et
de partager le comportement (du second
• L ’héritage capture une forme d ’abstraction,
niveau), complémentaire à celui des classes
appelée super-abstraction, qui est
vis à vis des objets (premier niveau).
complémentaire à l ’abstraction de données.
23 24
Relation et graphe d ’héritage(1)
Relation et Graphe d ’héritage(2)
• Une relation d ’héritage est préordre (réflexive et
transitive), liant une classe à sa super-classe: • Simple: une classe ne possède qu’une seule
– A hérite (sous-classe) de B est représenté par A <h B; super-classe directe:
• La représentation graphique de l ’héritage forme – L ’ensemble des classes est structuré (graphe
le graphe d ’héritage Gh=(Racine, Nœud, Arc): d ’héritage) sous forme d ’une arborescence.
– Racine=classe la plus générale, • Multiple: une classe possède plusieurs
– Nœud=l ’ensemble des classes du système. super-classes directes:
– Arc: il existe un arc orienté A---->B ssi A hérite de B. – le graphe d ’héritage forme un graphe orienté
sans circuit.
25 26
Les Types et les Classes(1) Les Types et les Classes(2)
• Le concept d ’un type et celui d ’une classe • La distinction entre les types et les classes peut
sont liés et peuvent ne pas être distingués: être détectée quand on compare la relation
– Le typage est utilisé pour la vérification de type; d ’héritage entre types et sous-types avec la
– les classes sont utilisés pour gérer et générer des relation d ’héritage entre classes et sous-
objets ayant des propriétés et des comportements classes.
uniformes. • L ’ensemble des valeurs satisfaisant un sous-
• Toute classe est un type alors qu’un type type est un sous-ensemble de l ’ensemble des
n ’est pas forcement une classe, puisque les valeurs satisfaisant le type.
prédicats ne déterminent pas nécessairement
des moules d ’un objet. 27 28
Sous-types et Sous-classes Implémentation de l ’héritage
Objet supertype Shared methods code
• Exemple1: les entiers naturels sont un sous-
type des réels, mais quand la soustraction est methods methods
définie pour toutes les paires des réels, elle
n ’est pas définies pour toutes les paires des field
entiers naturels.
• Exemple 2: les réels sont une sous-classe des Objet sous-type
entiers naturels, puisque l ’opération de methods shared methods
soustraction sur les entiers naturels peut être
shared field new methods
étendue à celle des réels.
new field
29 30
Héritage Vs Composition
• L ’héritage multiple permet de définir de
nouveaux objets par fusion de la structure et Typage et sous-typage dans les
du comportement de plusieurs autres et non
par composition.
Langages à Objets
• La composition d ’objets peut toujours être N. Hameurlain
réalisée par les variables d’instance. Lin2
• Exemple:
Automobile=Moteur+roue+Carosserie, +...
31 32
Objectifs du typage?
Réalisation du Typage
• Introduire une plus grande fiabilité dans le
langage en détectant les expressions qui ne • Regrouper les objets en catégories
sont pas bien formées distinctes: types;
– f(x) est bien formée si x appartient au domaine de
• Définir un ensemble de règles appelées
définition de f.
règles de typage;
• Exemples d ’expressions mal formés
• Simuler l ’exécution du programme en
– diviser par zéro, affecter une valeur à un indice
suivant les règles de typage, mais en tenant
hors des bornes d ’un tableau, envoyer un message
à un objet qui ne connaît pas, opérateur appliqué compte uniquement des types obtenus à
sur des objets pour lesquels il n ’est pas défini, etc chaque étape de simulation;
33 34
Les problèmes de typage dans les
Catégories de typages L.O
• Quel est le type d ’un objet, c ’est à dire
• Typage dynamique: réalisé pendant comment représenter le type d ’un objet (état
l ’exécution: interne+méthodes);
– les tests sont insérés dans le code et compilé, et • Comment typer les utilisations de self (par
sont ainsi réalisés pendant l ’exécution. une méthode par exemple d ’un objet)? Ce
• Typage statique: fait à la compilation type change t-il avec l ’héritage?
– la cohérence des types est vérifiée avant la • Comment typer la liaison tardive?
traduction en code machine.
• Qu’est ce que c ’est le polymorphisme et quel
est son lien avec l ’héritage
35 36
Langage des types Typage d’une expression
• Types atomiques (int, bool, float, …); • Se fait relativement à un environnement ou
• Types construits: contexte (noté E).
– d’opérateurs prédéfinis : ->, * • Environnement de typage: Liste de liaisons
• int --> int, int*int-->int (idf, type). Exemples:
– d’enregistrements déclarés (point, cercle, … – Un idf x est de type t dans un environnement E,
• Types récursifs si (x, t) est présente dans E;
– Arbre, etc.. – If e1: bool dans E e2 : t dans E e3: t dans E
If e1 then e2 else e3 : t dans E
• Notation: on notera t1, t2, t’ un type, et e:t se
lit « l’expression e est de type t » – e1: t->t’ dans E e2: t dans E
e1(e2): t’ dans E
37 38
Construction de l’environnement
Construction de l’environnement
de typage
• A partir des déclarations:
de typage (par synthèse)
– Toute déclaration introduit une liaison (idf, type) • Exemples (de règles):
– Le système vérifie que l’utilisation de l’idf est
conforme au type associé. – Si x est une constante entière, type(x) = int;
• Par synthèse: – Si e = (e1, e2), type (e) = type(e1)*type(e2)
– Le type de chaque idf est calculé à partir des – Si e = (fun x. e1),
occurrences d’utilisation de l’idf.
• Pas besoin de déclarer le type.
type (e) = type(x) -> type(e1);
– Le calcul est analogue à la résolution d’eqs en – Si e = e1 (e2), type (e1) = type (e2)->type (e)
mathématiques (notions de constantes, de variables et
de contraintes).
39 40
I. Le Polymorphisme
Le Polymorphisme
• Class point {
var x;
method getx{return x;} • Peut-on appliquer la fonction Origin aux
method move (d) {x:= x+d;}
};
objets de type Colorpoint?
• Class Colorpoint : hérite point{ • Oui, s’il existe une notion de
Var c; polymorphisme dans le langage.
method getcolor{return c;}
method setcolor (c’){c:= c’;} • Définition: une fonction, une méthode ou un
};
objet est polymorphe si on peut l’employer
• Soit la fonction Origin (p : point) {
avec plusieurs types.
return([Link]= =0)}
41 42
Polymorphisme paramétrique:
Problème du polymorphisme
définition
• Soit F(o: t) = … /*opérations sur o*/ • Si les opérations effectuées sur o ne sont pas
• On veut faire F(a) où a : t’ et t’≠ t. dépendantes de son type (recopie,
– Comment assurer que cet appel ne provoque pas comparaison, égalité), le type de F est
d’erreurs de typages à l’exécution?
polymorphe paramétrique, et on peut utiliser
– Quelles conditions doit remplir tout type t’?
F avec tout type qui est une instance de ce
• Il existe trois formes du polymorphisme:
type polymorphe.
– Polymorphisme paramétrique;
– Polymorphisme d’inclusion ou sous-typage
– Surcharge;
43 44
Polymorphisme d’inclusion ou Surcharge
sous-typage: définition
• Le code des fonctions n’est pas partagé,
• Si le type t’ est tel que: toutes les opérations contrairement au poly. par. et d’inclusion.
sur t sont aussi définies sur t’, alors on peut • Exemple: surcharge d’opérateurs ‘+’
utiliser tout objet a: t’où un objet de type t (entiers, réels, etc…)
était attendu: • Pour chaque utilisation de l’opérateur
– t = {réels} et t’= {entiers} surchargé, le compilateur doit décider quel
• On dira que t’ est un sous type de t ou t’ est code exécuter, et ceci selon le type des
inclus dans t. arguments donnés.
45 46
II. Quel polymorphisme pour les
Polymorphisme (conclusion)
objets
• Le poly. d’inclusion et paramétrique ont en • « Peut – on utiliser les opérations définies pour les
commun une propriété très importante: super-classes sur les objets des sous classes? »
– Une fonction polymorphe peut être appliquée • Exemple: Colorpoint est sous-classe de Point,
sans changement de code à une infinité de types peut-on utiliser Origin avec des points de couleur.
d’arguments. • L’héritage doit garantir le poly. des méthodes et
des opérations des super-classes:
• Le poly. d’inclusion et paramétrique est un
– N’importe quelle opération définie sur une super-classe
moyen de partager aussi bien le code source doit pouvoir s’utiliser sur une sous-classe.
que du code exécutable.
47 48
Polymorphisme paramétrique:
Polymorphisme paramétrique :
variable de types
Instanciation
• Le langage de type est étendu avec des variables,
notées a, b, c, … • Définition: t(a b c) une expression de type
• Une expression de type peut contenir des var. a-> int, qui contient les var. a, b, c. On dit que t’ est
b->b, … une instance de t(a b c) s’il existe des types
• La valeur de la sous-expression qui est typée par une ta, tb, tc tel que t’ = t(a b c) [a/ta, b/tb; c/tc],
var. de type n’a pas de contraintes associées et donc
n’intervient pas dans le calcul où [x/t] est la substitution de x par t.
– Identite (x) = {x} a pour type a->a • Dans le cas où les types sont déclarés, la
• L’introduction de var. de type permet une abstraction substitution est donnée par l’utilisateur.
sur le code.
49 50
Polymorphisme paramétrique:
Polymorphisme d’inclusion
définition
• Fonction ayant dans son type des par. ou variable de • Connu sous le nom du sous-typage:
types qui pourront être spécialisés (instanciées) à
– pas d’instances de type mais plutôt d’inclusion de type
n’importe quel type
– L’instanciation d’une variable de type a vers un type t est
• Définition 1: un type t’ est un sous-type d’un (inclus
notée par [a/t]. dans un) type t, noté t’ ≤ t, si n’importe quelle
opération définie sur t est aussi définie sur les
• Définition: un type τ’ est une instance polymorphe
éléments du type t’.
du type τ s’il existe une spécialisation [a/t] des var.
de type τ telle que τ’= τ[a/t]. – Un objet de type t’ peut (être vu) remplacer sans danger
un objet de (comme ayant le) type t;
• Caractérisé par la relation d’instantiation qui existe • Définition 2: si a a le type t’, et si t’ est un sous type
entre le type général de la fonction et le type de t, alors a a le type t.
particulier de chaque spécialisation.
– Colorpoint est sous-type de Point?
51 52
Langage à Objets et III. Sous-typage et L.O
polymorphisme – « La notion d’héritage assure t-elle l’utilisation
polymorphe des méthodes héritées? »
• La plupart des L.O font le choix du Poly. • Appel de fonctions avec sous-typage:
d’inclusion ou sous-typage. Ce mode de – Sous quelle conditions un appel de fonction est bien typé
poly. pose problème lors de l’héritage: en présence du sous-typage.
• Sous-typage entre objets:
– Faire « comme ci » le poly. est « transmis » par
– Quand est-ce que deux types d’objets sont en relation de
héritage: erreur de typage lors de l’exécution. sous-typage?
– Restreindre l’ensemble des classes que l’on • Sous-typage entre fonctions:
peut écrire: l’expressivité du langage est réduite – Comment savoir si deux types (fonctionnelles) de
de manière importante (C++, par exemple). fonctions sont en relation de sous-typage
53 54
Appel de fonctions avec sous- Sous-typage entre objets (1)
typage • Soit t = <m1: τ1; m2: τ2;…, mn: τn >, quelle est la
• Prend en compte le fait que le typage du par. effectif forme de tout type t’ sous-type de t, i.e. qui peut
peut être un sous-type du par. formel. remplacer t de manière sûre?
• Règle: f:στ • On doit pouvoir appliquer aux objets de type t’ au
moins toutes les opérations valides sur t:
a : σ’ dans A et σ‘≤ ≤σ – t’ doit avoir au moins toutes les méthodes de t, mais
Alors, f(a) est bien typé dans A et a le type τ peut éventuellement en avoir plus.
– En effet: si σ‘≤
≤ σ alors toutes les op. sur σ sont aussi • Les types de méthodes communes sont en relation
définies sur σ’.Ainsi f, qui attend un argument de type σ de sous-typage:
peut recevoir un type σ’ en toute sécurité. – Si m a le type τ’ dans t’ et τ dans t alors τ’≤
≤ τ.
55 56
Sous-typage entre objets (2) Sous-typage entre fonctions
• Règle: t = <m1: τ1; m2: τ2;…; mn: τn >, • Class A = { Class B = {
t’ = <m1: σ1; m2: σ2; …, mn: σn; τ’ >, où …. ….
τ’ est une suite de méthodes. method f : t->q} method f : m->n}
t’ est sous-type de t dans A (t’ ≤ t), si σi ≤ τi, i =1, …,n; Pour établir B ≤ A il faut vérifier (m->n) ≤ (t->q)
– En effet, si o: t et o’:t’, et si m est une méthode de o avec le • Règle: deux types fonctionnelles, (m->n) et (t->q),
type τ , alors o’.m: τ’ pourra être vu comme ayant le type τ sont en relation de sous-type, i.e. (m->n) ≤ (t->q)
ssi τ’ ≤ τ. ssi t ≤ m et n ≤ q.
• Remarque: dans la plupart des L.O, l’ordre des • On dit que la règle de sous-typage entre fonctions est
méthodes n’a pas d’importance dans la comparaison co-variante (va dans le même sens) pour les types
des types d’objets. résultats, alors qu’elle est contre-variante (change de
• Exemple: Colorpoint ≤ point sens) pour les types arguments (en entrée).
57 58
Sous-classe ≠ Sous-type (1) Sous-classe ≠ Sous-type (2)
• Le sous-typage entre deux classes impose le sous-
typage entre les types de leurs méthodes; • Class A= { Class B = hérite de A{
• Le sous-typage fonctionnel doit satisfaire la règle de …. …
variance/covariance method m(a : t); } method m (a : t’);}
• Problème: souvent la contre-variance est contraire à • Sachant que l’on veut faire une spécialisation
la manière dont le programmeur veut définir les
classes, les méthodes par héritage, à savoir, par des arguments, c à d, t’ ≤ t, alors que la règle
spécialisation des types pour les arguments des impose:
méthodes:
B ≤ A, si t ≤ t’ (règle de contre-variance)
• Ce problème connu sous le nom « Problème de
contre-variance ».
59 60
Sous-classe ≠ Sous-type: Sous-classe ≠ Sous-type:
exemple (1) exemple (2)
• Soient les classes: aliments, viande, et
légumes telles que: • végétarien est une sous-classe de personne ;
– viande ≤ aliments et légumes ≤ aliments Mais est – elle un sous-type de personne?,
• Class Personne () { c’est à dire végétarien ≤ personne (1).
method manger (a : aliments) {} • Si (1) est vrai, par la règle de sous-typage
} fonctionnelle, on a :
• Class végétarien(): hérite personne {
– aliments ≤ légumes, ce qui est contraire aux
method manger (a : légumes){} hypothèses
}
61 62
Sous-classe ≠ Sous-type: Sous-classe ≠ Sous-type:
exemple (3) conclusion
• Intuitivement: Soit la fonction • Il est fondamentale de préserver l’égalité,
Chez_Macdo (p : personne) = {[Link](BigMac);} « sous-classe = sous-type » dans L.O:
où BigMac: viande. – Permet d’utiliser les opérations de la super-classe de
• Si (1) est vraie, soit GND: végétarien, qui peut être manière polymorphe.
utilisé à la place du type personne, on obtient donc • Quand cette égalité risque de ne pas être vérifiée
GND. manger(BigMac)!!!!!!!;
– Interdire l’écriture de la classe héritière;
• Cet appel est sémantiquement incorrect, et il est mal
– Imposer à l’utilisateur de lui donner le même type que
typé: la méthode manger d’un végétarien n’accepte
dans la classe parente, ceci interdit l’utilisation de cette
pas le type viande. méthode de manière polymorphe (C++).
• En réalité (1 ) n’est pas vérifiée!
63 64