isbn 0-321-49362-1 chapitre 12 langages orientés objets
TRANSCRIPT
ISBN 0-321-49362-1
Chapitre 12
Langages orientés objets
1-2
Chapitre 12
• Langages orientés objets• Choix de conception• C++• Java• C#• Implémentation
1-3
Langages orientés objets (POO)
Doit supporter:• Types de données abstraits
– Discutés au chapitre précédent
• Héritage– Un concept central en POO
• Liaison dynamique des méthodes– Permet le polymorphisme
1-4
Héritage
• Limites des types de données abstraits:– Les TDA peuvent rarement être réutilisés sans
modification.– Tous les TDA sont indépendents (au même
niveau) ce qui ne réflète pas la structure des problèmes
• L'héritage permet de définir une classe A en termes d'une autre classe B– A hérite des types de données et des
fonctionalités de B
• Permet d'outrepasser les limites des TDA et d'augmenter la productivité
1-5
Terminologie
• Les TDA sont des classes• Une instance de classe est appelée objets• Si une classe B hérite des données et des
fonctionalités d'une classe A alors on dit:– B est une sous-classe ou classe dérivée de A– A est un parent ou super-classe de B
• Les sous-programmes définissant les opérations sur les objets sont appelés méthodes
1-6
Terminologie (suite)
• Un appel à une méthode est appelé messages
• L'ensemble des méthodes d'un objet est appelé interface ou protocole.
• Un message possède deux parties:– Un nom de méthode– Un objet destinataire
• Dans le cas le plus simple une sous-classe hérite de toutes les entités (données et méthodes) de son parent.
1-7
Terminologie (suite)
• L'héritage peut être plus compliqué en raison de la présence de contrôles d'accès:– Un classe peut cacher certaines entités à ses
sous-classes– Elle peut cacher certaines entités à ses clients– Elle peut cacher certaines entités à ses clients
et les montrer à ses sous-classes
• Une sous-classe peut modifier une méthode qu'elle a héritée– La nouvelle méthode remplace (overrides)
alors l'ancienne
1-8
Terminologie (suite)
• Deux types de variables dans une classe:– Variable de classe (une par classe)– Variable d'instance (une par objet)
• Deux types de méthodes:– Méthode de classe – Le destinataire est une
classe– Méthode d'instance– Le destinataire est un objet
• Héritage simple et multiple• Désavantage de l'héritage:
– Crée une interdépendance entre les classes qui peut être difficile à gérer.
1-9
Liaison dynamique des méthodes
• Polymorphisme: Une variable peut contenir des objets d'un type de base ainsi que de tous les sous-types.
• Lorsqu'une variable polymorphique appelle une méthode, le choix de la méthode est déterminé à l'exécution.
• Facilite le développement et la maintenance de logiciels.
1-10
Liaison dynamique: concepts
• Méthode abstraite (ou virtuelle): pas de définition, seulement le protocole.
• Classe abstraite: Au moins une méthode virtuelle
• On ne peut pas instancier une classe abstraite
1-11
Choix de conception
• Exclusivité des objets• Est-ce que les sous-classes sont des sous-
types?• Polymorphisme et vérification de types• Héritage simple et multiple• Allocation et libération d'objets • Liaison statique et dynamique• Classes imbriquées
1-12
Exclusivité des objets
• Tout est un objet– Avantages - élégance et uniformité– Désavantages - Ralenti les opérations sur les types élémentaires
• Ajouter les objets à un système de typage impératif– Avantages - Opérations rapides sur les types conventionnels– Désavantages - Perte de lisibilité (2 sortes d'entités)
• Système de typage impératif pour les types élémentaires; tout le reste est objet– Avantage - Les opérations sur les types élémentaires (les plus
utilisés) sont rapides– Désavantage - Toujours un peu de confusion à cause des deux
système de typage.
1-13
Une sous-classe est-elle un sous-type?
• Si B est une classe dérivé de A et sib est une instance B, est-ce que b est un objet de type A?– Dans ce cas b doit se comporter comme les
instances de A
• S'il existe une telle relation etre A et B alors on dit que B est un sous-type de A– B peut seulement ajouter des variables et des
méthodes– B peut remplacer les méthodes de A
seulement si la compatibilité est préservée
1-14
Polymorphisme et vérification de types• Le polymorphisme peut nécessiter la vérification
dynamique des types– Par exemple, x peut être un entier dans la classe de
base et un réel dans la classe dérivée.– La vérification dynamique des types ralentie l'exécution
et retarde la détection des erreurs
• Si le remplacement des méthodes par une sous-classe est restreint à respecter le type des paramètres et la valeur de retour alors la vérification peut être effectué à la compilation
1-15
Héritage simple et multiple
• L'héritage multiple permet à une classe d'hériter de plusieurs classes parents
• Désavantages:– La complexité du langage et de son implémentation est
augmenté – Que se passe-t-il si les deux parents possèdent une
méthode ayant le même nom?– Peut affecter l'efficacité - La liaison dynamique est un peu
plus couteuse
• Avantages: – Quelques fois très utile– Permet de mieux représenter la structure de certains
problèmes
1-16
Allocation et libération d'objets
• Les objets sont placés dans quelle partie de la mémoire?– Comme les TDA ils peuvent être placés n'importe où
• Sur la pile• Créé explicitement sur le tas (via new)
– S'ils sont tous dynamique sur tas alors on peut y accéder de façon uniforme à l'aide de pointeurs ou de références
– Si les objets peuvent être dynamiques sur pile alors cela rend plus difficile l'implémentation des sous-types
• La libération des objets est-elle implicite ou explicite?
1-17
Liaison statique et dynamique
• Est-ce que toutes le liaisons des méthodes doivent être dynamique? – La liaison statique est plus efficace
• On peut permettre à l'usager de le spécifier
1-18
Classes imbriquée
• Si une classe n'est utile qu'à une seule autre classe alors il est inutile de la rendre accessible à toutes les autres classes
• Supposons que la classe A contient la classe B:– Quelles composantes de A sont visibles dans B– Quelles composantes de B sont visibles dans A
1-19
Exemple C++
• Langage OO le plus utilisé• À la fois OO et impératif• Héritage
– Une classe n'a pas nécessairement de classe parent
– Contrôles d'accès – Private – Public – Protected
1-20
Exemple C++ (2)
• Une classe peut être dérivé de trois façons:– Private - Les membres publiques et protégés
hérités de la classe parent deviennent privée– Public - Pas de changement– Protected - Les membres publiques deviennent
protégés.
1-21
Exemple C++ (3)
class base_class { private: int a; float x; protected: int b; float y; public: int c; float z;};
class subclass_1 : public base_class { … };// b et y sont protégés// c et z sont publique
class subclass_2 : private base_class { … };// b, y, c, et z sont privés,// aucune classe dérivée n'a accès aux// membres de la classe de base
1-22
Exemple C++ (4)
• Si V est une instance de subclass_2 alors les variables c et z de base_class ne sont pas directement accessible à V
• On peut les rendre accessibles en utilisant l'opérateur de portée ::
• Par exemple:class subclass_3 : private base_class { base_class :: c; …}subclass_3 S;S.c=0;
1-23
Exemple C++ (5)
• L'héritage multiple est supporté
– Si deux membres hérités ont le même nom alors on doit utiliser l'opérateur de portée
– Exemple: supposons que A et B possède une variable publique entière X
class sous-classe: public A, public B{ ...
}; sous-classe V; V.A::x=0; V.B::x=1;
1-24
Exemple C++ (6)
• Liaison dynamique– On peut utiliser le mot clef virtual devant
une méthode– Cela signifie que la liaison de cette fonction
sera dynamique et qu'elle peut être appelée par des variables polymorphiques
– Une fonction virtuelle pure ne contient aucune définition
– Une classe contenant au moins une fonction virtuelle pure est appelée classe abstraite
1-25
Exemple Java
• Caractéristiques générales– Toutes les données sont des objets sauf les types
élémentaires– Tous les types élémentaires posèdent une classe
enveloppe (wrapper)– Tous les objets sont dynamiques sur tas– L'espace des objets peut être alloué à l'aide de
l'opérateur new– On réfère aux objets à l'aide de variables références– Une méthode finalize est implicitement appelée
lorsque le ramasse miette récupète la mémoire occupée par l'objet. Cette méthode ne peut être appelée explicitement.
1-26
Exemple Java (2)
• Héritage– Seule l'héritage simple est supporté– Une interface est une sorte de classe abstraite
permettant de procurer certains des avantages de l'héritage multiple.
– Une interface ne peut inclure que des déclarations de méthodes et des définition de constantes:
– Par exemple:public interface Comparable {
public int comparedTo (Object b);
}
1-27
Exemple Java (3)
• Liaison dynamique– En java, les messages sont liés
dynamiquement au méthodes à moins que la méthode soit final
– Un méthode final ne peut pas être remplacée– La liaison statique est utilisée si la méthode
est static ou private (les deux interdisent le remplacement de la méthode).
1-28
Exemple Java (4)
• Évaluation– Similaire à C++– Ne supporte pas la programmation
procédurale– Toutes les classes ont une classe parent (sauf
la classe Object)– Par défaut la liaison dynamique est utilisée– Les interfaces sont utilisée pour fournir une
forme simple d'héritage multiple
1-29
Exemple C#
• Caractéristiques générales– Similaire à Java sauf que, par défaut les
méthodes, sont statiques– classes et structs– structs: moins puissants que les classes; ne
supporte pas l'héritage; dynamique sur pile
1-30
Exemple C# (2)
• Héritage– Syntaxe similaire au C++– Une méthode peut être remplacé en utilisant
le mot clef new– La méthode du parent peut être utilisée en
préfixant le message avec le nom du parent
base.Draw()
1-31
Exemple C# (3)
• Liaison dynamique:– On ajoute à la méthode de la classe de base le
mot clef virtual– On ajoute à la méthode de la classe dérivé le
mot clef override EX. http://msdn.microsoft.com/fr-fr/library/ms173153(VS.80).aspx
– Une méthode abstraite est précédée du mot clef abstract et doit être implémenté dans toutes les sous-classes
– Toutes les classes dérivent ultimement de la classe racine Object
1-32
Exemple C# (4)
• Évaluation– C# est le plus récent langage OO dérivé du C– Les différences entre Java et C# sont mineures
en ce qui a trait au support à la programmation OO
1-33
Implémentation
• Deux points d'intérêts– Structure de donnée pour les instances de
classes– Liaison dynamique
1-34
Table d'instance de classe (TIC)
• Une table d'instance de classe (Class instance record) contient les variables membres d'un objet– Statique (construit à la compilation)
• Si une classe est dérivée d'une autre alors sa TIC contient les entrées de la TIC du parent ainsi que ses propres variables membres.
• Puisque la TIC est statique, l'accès aux variables membres est effectué comme s'il s'agissait d'une structure en C– Efficace
1-35
Table de méthodes virtuelles (vtable)
• Les méthodes qui sont liées statiquement n'ont pas besoin d'apparaître dans la TIC– Leur adresse est connue avant l'exécution
• Les choses sont différentes lorsque la liaison est dynamique– On ne sait pas à la compilation à quelle méthode un message
s'adresse – On ajoute un pointeur à la TIC vers une table de pointeurs
(vtable)– La vtable contient l'adresse des méthodes – Un message à une méthode virtuelle consiste à:
• trouver l'adresse de la vtable• calculer le décallage approprié• aller à l'adresse de la méthode
– Plusieurs vtables sont nécessaires lorsqu'il y a héritage multiple.
1-36
Exemple: héritage simple
class A {
public int a, b;
public void draw(){...}
public int area(){...}
}
class B: public A{
public int c, d;
public void draw(){...}
public void sift(){...}
}
Copyright © 2007 Addison-Wesley. All rights reserved. 1-37
1-38
Exemple: héritage multiple
class A {public:
int a;virtual void fun(){...}virtual void init(){...}
}class B{
public:int b;
virtual void sum(){...} }class C: public A, public B{
public:int c;virtual void fun(){...}virtual void dud(){...}
}
Copyright © 2007 Addison-Wesley. All rights reserved. 1-39