INF224 Partie 1
INF224 Partie 1
INF224 Partie 1
Rodrigue DJEUMEN
Sommaire
Les concepts de base de l'orienté objet à étudier dans cette leçon :
1 Objets et classes
2 Encapsulation
3 Héritage
4 Polymorphisme
5 Généricité
L'Orientée Objet
L'approche orientée objet considère le logiciel comme une collection d'objets
dissociés et identiés, dénis par des propriétés. Une propriété est soit un
attribut (i.e. une donnée caractérisant l'état de l'objet), entité élémentaire
comportementale de l'objet.
La fonctionnalité du logiciel émerge alors de l'interaction entre les diérents
objets qui le constituent.
L'une des particularités de cette approche est qu'elle rapproche les données
et leurs traitements associés au sein d'un unique objet.
La diculté de cette modélisation consiste à créer une représentation
abstraite, sous forme d'objets, d'entités ayant une existence matérielle
(chien, voiture, ampoule, personne, ...) ou bien virtuelle (client, temps, ...).
La Conception Orientée Objet (COO) est la méthode qui conduit à des
architectures logicielles fondées sur les objets du système, plutôt que sur la
fonction qu'il est censé réaliser. Le langage de modélisation le plus utilisé
dans ce domaine est UML (Unied Modeling Language).
Objet
Un objet est caractérisé par les trois notions suivantes :
L'identité : L'objet possède une identité, qui permet de le distinguer des autres
objets, indépendamment de son état. On construit généralement cette identité
grâce à un identiant découlant naturellement du problème (par exemple un
produit pourra être repéré par un code, une voiture par un numéro de série, etc.)
Les attributs : Il s'agit des données caractérisant l'objet. Ce sont des variables
stockant des informations sur l'état de l'objet.
Les méthodes : Les méthodes d'un objet caractérisent son comportement,
c'est-à-dire l'ensemble des actions (appelées opérations) que l'objet est à même de
réaliser. Ces opérations permettent de faire réagir l'objet aux sollicitations
extérieures (ou d'agir sur les autres objets). De plus, les opérations sont
étroitement liées aux attributs, car leurs actions peuvent dépendre des valeurs des
attributs, ou bien les modier.
Classe
Une classe est un concept abstrait représentant des éléments variés comme :
des éléments concrets (ex : des avions),
des éléments abstraits ( ex : des commandes),
des composants d'une application (ex : les boutons des boîtes de dialogue),
des structures informatiques (ex : des tables de hachage),
des éléments comportementaux (ex : des tâches), etc.
Tout système orienté objet est organisé autour des classes.
Dénition
Une classe est la description formelle d'un ensemble d'objets ayant une
sémantique et des propriétés communes.
Propriétes
Les propriétés d'un objet permettent de spécier son état et son comportement.
État d'un objet (attributs) : Ce sont les attributs qui décrivent l'état d'un objet.
On utilise les attributs pour des valeurs de données pures, dépourvues d'identité,
telles que les nombres et les chaînes de caractères. Les propriétés décrites par les
attributs prennent des valeurs lorsque la classe est instanciée.
Comportement d'un objet (comportement) : Les opérations décrivent les
éléments individuels d'un comportement que l'on peut invoquer. Ce sont des
fonctions qui peuvent prendre des valeurs en entrée et modier les attributs ou
produire des résultats.
Une opération est la spécication (i.e. déclaration) d'une méthode.
L'implémentation (i.e. dénition) d'une méthode est également appelée méthode.
Il y a donc une ambiguïté sur le terme méthode.
Classe en java
Les deux classes précédentes, Compte et V éhicule se représentent de la
manière suivante :
class Compte{
//attributs
int solde;
int plancher;
//méthodes
void crediter(int m){}
boolean debiter(int m){}
}
class Vehicule{
//attributs
String immatriculation;
String marque;
String couleur;
//méthodes
void avancer(){}
void reculer(){}
}
Rodrigue DJEUMEN Introduction au Génie Logiciel 8 / 45
Objets et Classes Notion de classe
Objet en java
Une objet est représenté en java par les opérations de déclaration et
d'instanciation. Exemple, considérons des objets correspondants aux classes
Compte et Vehicule précédentes :
Les déclarations sont les suivantes :
Compte cpt;
Vehicule megane, golf, epsilon;
Les opérations d'instanciation
cpt = new Compte();
megane = new Vehicule();
golf = new Vehicule();
epsilon = new Vehicule();
Il est tout aussi possible de déclarer et d'instancier un objet à l'aide de
la même instruction :
Compte cpt = new Compte();
Compte()et Vehicule() sont les constructeurs de classes Compte et
Vehicule respectivement.
Rodrigue DJEUMEN Introduction au Génie Logiciel 9 / 45
Objets et Classes Notion de classe
Surcharge de méthodes
Dans une classe, une opération (même nom et même types de paramètres)
doit être unique.
Quand le nom d'une opération apparaît plusieurs fois avec des paramètres
diérents, on dit que l'opération est surchargée on parle aussi de surchage
de méthode.
En revanche, il est impossible que deux opérations ne se distinguent que par
leur valeur retournée.
L'intérêt de la surchage de méthodes réside dans le fait qu'elle permet de
dénir plusieurs méthodes, sous le même vocable mais manipulant des
données de type diérents. Comme illustration considérons :
class PrintStream{
...
void print(Object arg) {...}
void print(String arg) {...}
void print(char [] arg) {...}
...
}
print() peut être appelé avec un argument de n'importe quel type, la méthode
appropriée sera utilisée pour la gestion du problème initial.
Rodrigue DJEUMEN Introduction au Génie Logiciel 10 / 45
Objets et Classes L'opérateur . et le pointeur this
L'opérateur .
Le pointeur this
this est le seul pointeur en java, il va permettre à une méthode d'accéder à la classe dans
laquelle elle est dénie.
Par défaut dans une méthode, java fait reférence à la variable de la classe.Cependant si
une variable dans cette même méthode porte le même nom, java va faire reférence à le
variable de la méthode (portée de variable), grâce à this on va pouvoir préciser la variable
que l'on souhaite.
class ExempleThis{
String s = Variable dela classe;
void appel(){
System.out.println(s);
String s = Variable de la méthode;
System.out.println(s);
System.out.println(this.s);
}
}
Dénition
La protection de données ou encapsulation, est un mécanisme
consistant à rassembler les données et les méthodes au sein d'une
structure en cachant l'implémentation de l'objet, c'est-à-dire en
empêchant l'accès aux données par un autre moyen que les services
proposés. Ces services accessibles (oerts) aux utilisateurs de l'objet
dénissent ce que l'on appel l'interface de l'objet (sa vue externe).
L'encapsulation permet donc de garantir l'intégrité des données
contenues dans l'objet.
L'encapsulation permet de dénir des niveaux de visibilité des éléments
d'un conteneur. La visibilité déclare la possibilité pour un élément de
modélisation de référencer un élément qui se trouve dans un espace de
noms diérents de celui de l'élément qui établit la référence. Elle fait
partie de la relation entre un élément et le conteneur qui l'héberge, ce
dernier pouvant être un paquetage, une classe ou un autre espace de
noms.
Rodrigue DJEUMEN Introduction au Génie Logiciel 14 / 45
Encapsulation Niveaux de visibilité
Niveaux de visibilité
Notations
La classe Point2D
class Point2D{
private int x;
private int y;
public Point2D(int x0, int y0){
x = x0;
y = y0;
}
public void deplacer(int dx, int dy){
x += dx;
y += dy;
}
public void afficher(){
System.out.println(position x: +x);
System.out.println(position y: +y);
}
}
Rodrigue DJEUMEN Introduction au Génie Logiciel 17 / 45
Encapsulation Exemple d'application
Classe abstraite
Une classe abstraite est une classe qui ne peut pas être utilisée, pour
fabriquer des instances d'objets (non instanciable) ; elle sert uniquement de
modèle, que l'on pourra utiliser pour créer des classes plus spécialisées par
dérivation (héritage).
Le nom d'une classe abstraite s'écrit en italique, ou bien est précédé du
stéréotype << abstract >>.
Une classe abstraite peut posséder des membres privés ou des attributs
privés ou publics ; d'autre part, les méthodes peuvent faire l'objet d'une
implémentation, même si la méthode est purement virtuelle.
Exercice I
Exercice II
Exercice III
Exercice IV
Une pile d'entier est une structure de donnée dans laquelle, les informations sont
rangées telles que le dernier à être rangé est premier à sortir. ces informations
peuvent être conservées dans un tableau de taille xe. une classe PileEntier
comporte les méthodes suivantes :
PileEntier (int n) le constructeur allouant dynamiquement un emplacement
de n entiers,
void empiler (int p) ajoute l'ntier p sur la pile si possible,
int depile() fournit la valeur située au sommet de la pile, cela si possible,
boolean pleine() renvoie true si la pile est pleine et false sinon
boolean vide() renvoit true si la pile est vide et false sinon.
Travail à faire :
Généralisation et héritage
La généralisation décrit une relation entre une classe générale (classe de base ou
classe parent) et une classe spécialisée (sous-classe). La classe spécialisée est
intégralement cohérente avec la classe de base, mais comporte des informations
supplémentaires (attributs, opérations, associations). Un objet de la classe
spécialisée peut être utilisé partout où un objet de la classe de base est autorisé.
Dans la plupart des langages objet, cette relation de généralisation se traduit par le
concept d'héritage. On parle également de relation d'héritage. Ainsi, l'héritage
permet la classication des objets.
Propriétés
Les propriétés principales de l'héritage sont :
La classe lle possède toutes les propriétés des ses classes parents, mais elle
ne peut accéder aux propriétés privées de celle-ci.
Une classe lle peut redénir (même signature) une ou plusieurs méthodes
de la classe parent. Sauf indication contraire, un objet utilise les opérations
les plus spécialisées dans la hiérarchie des classes.
Une instance d'une classe peut être utilisée partout où une instance de sa
classe parent est attendue. Par exemple, en se basant sur le diagramme de la
gure ci-dessus, toute opération acceptant un objet d'une classe Animal doit
accepter un objet de la classe Chat.
Une classe peut avoir plusieurs parents, on parle alors d'héritage multiple (cf.
la classe Ornithorynque de la gure ci-dessus). Le langage C++ est un des
langages objet permettant son implémentation eective, le langage java ne
le permet pas.
Implémentation java
La relation d'héritage est implémentée en java à l'aide du mot clé extends , pour dire que
la classe dérivée est une extension de la classe de base. Le code java correspondant est :
//la super Classe
super
Le mot clé super fait référence à la super-classe de la classe dans laquelle il
est appelé. Il permet d'invoquer le constructeur de la super-classe. super
doit être déclaré au tout début d'un constructeur d'une sous-classe ; cela lui
permet d'eectuer au moins les mêmes tâches que le constructeur de la
super-classe.
public class Personne{
public void Personne(String nom) {...}
}
public class Etudiant{
private int note;
public void Etudiant(String nom, int note) {
super(nom);
this.note = note;
...
}
}
Rodrigue DJEUMEN Introduction au Génie Logiciel 27 / 45
Héritage Héritage multiple
Héritage multiple
L'héritage multiple est mécanisme par lequel une sous-classe hérite des
propriétés de plus d'une super-classe .
L'héritage multiple est une extension au modèle d'héritage simple où l'on
autorise une classe à posséder plusieurs classes mères an de modéliser une
généralisation multiple.
Interface
Une interface est une classe abstraite dont toutes les méthodes sont
abstraites et dont tous les attributs sont des constantes.
Liste de méthodes dont on donne seulement la signature
Représente un "contrat", ce qu'on attend d'un objet
Peut être implémentée par une ou plusieurs classes qui doivent donner
une implémentation pour chacune des méthodes annoncées (et
éventuellement d'autres).
Une classe peut implémenter plusieurs interfaces (permettant un
héritage multiple, en les séparant par des virgules après le mot
implements).
Toutes les méthodes d'une interface sont implicitement abstraites.
Une interface n'a pas de constructeurs
Une interface ne peut avoir de champs sauf si ceux-ci sont statiques.
Une interface peut être étendue par une ou plusieurs autre(s)
interface(s).
Interface
Exercice V
Exercice Va :
Une personne est dénie par son nom, son prénom, sa date de naissance, sa
profession et son numéro de CNI. Proposer une implémentation de la classe
Personne en java.
Exercice Vb :
On veut modéliser un compte en banque, les informations primordiales sont :
le solde , le titulaire et le numéro de compte. Ecrire pour cela la classe
Compte correspondante (on reprendra les dénitions données en cours). Le
constructeur doit prendre 2 paramètres : le solde initial et le propriétaire du
compte (une Personne, voir exo Va).
1 Créer une classe CompteCredit, sous classe de Compte qui permet de
calculer les intérêts à partir d'un taux d'intérêt qui par défaut est de
5% (il y a deux constructeurs pour cette classe).
2 Créer une classe ComptePlacement sous classe de CompteCredit telle
qu'on ne puisse plus ajouter d'argent après sa création, le montant
étant donné à la création.
Rodrigue DJEUMEN Introduction au Génie Logiciel 32 / 45
Héritage Exercices
Exercice VI
Créer une classe Banque qui permet de manipuler une liste de Compte de tout
type. Cette classe doit fournir les méthodes :
boolean creerCompte(int type, int solde, Personne personne) où type est un
nombre qui représente un type de compte à créer :
0 = Compte , 1 = CompteCredit , 2 = ComptePlacement .
boolean supprimer Compte(int num)
Compte getCompte(int num)
Vector rechercheCompte(String nom) retourne la liste de compte des
personnes de nom nom
afficherSolde(String nom) ache tous les comptes (numéro et solde) des
personnes de nom nom.
Constructeur :
public Vector()
Méthodes :
public void add(Object o) -> ajoute o dans la liste
public boolean contains(Object o) -> true ssi o appartient à la liste
public Object get(int i) -> retourne l'élément à la position i
public int indexOf(Object o) -> retourne la position de o
public void insertElementAt(Object o, int i) -> insère o à la position i
public boolean isEmpty() -> true ssi la liste est vide
public void removeAll() -> vide la liste
public boolean remove(Object o) -> supprime o
public boolean remove(int i) -> supprime l'élément a la position i
public int size() ->retourne la taille de la liste
Dénition du polymorphisme
Le nom de polymorphisme vient du grec et signie qui peut prendre
plusieurs formes. Cette caractéristique est un des concepts essentiels de la
programmation orientée objet. Alors que l'héritage concerne les classes (et
leur hiérarchie), le polymorphisme est relatif aux méthodes des objets.
Le polymorphisme ad hoc
Le polymorphisme paramétrique
Le polymorphisme paramétrique, appelé généricité, représente la possibilité
de dénir plusieurs fonctions de même nom mais possédant des paramètres
diérents (en nombre et/ou en type). Le polymorphisme paramétrique rend
ainsi possible le choix automatique de la bonne méthode à adopter en
fonction du type de donnée passée en paramètre.
Ainsi, on peut par exemple dénir plusieurs méthodes homonymes addition()
eectuant une somme de valeurs.
La méthode int addition(int, int) pourra retourner la somme de deux
entiers
La méthode oat addition(oat, oat) pourra retourner la somme de
deux ottants
La méthode char addition(char, char) pourra dénir au gré de l'auteur
la somme de deux caractères
etc.
On appelle signature le nombre et le type (statique) des arguments d'une
fonction. C'est donc la signature d'une méthode qui détermine laquelle sera
appelée.
Rodrigue DJEUMEN Introduction au Génie Logiciel 37 / 45
Polymorphisme Le polymorphisme d'héritage
Le polymorphisme d'héritage
Le concept
Considérons les deux imlémentations de tableau ci-dessous
La seule diérence entre TabInt et TabDouble, est le type des éléments du tableau.
A chaque nouveau type d'éléments à charger dans le tableau, on est obligé de
réimplémenter toute la structure du tableau.
La généricité consiste à créer une classe, en lui permettant de prendre en paramètre(s),
le(s) type(s) de ses éléments : on parle de classe paramétrée ou modèle de classe.
Implémentation java
public class Tab <T>{
private ArrayList<T> tab;
Tab(int taille){
tab = new ArrayList<T> ();
}
Tab(){ }
Le type int étant primitif, n'est pas un objet et ne peut pas de ce fait
être un paramètre d'une classe paramétrée.
L'objet Integer est utilisé à la place du type int .
Instanciation d'une classe paramétrée
tab.addElement(0,20);
tab.addElement(1,21);
tab.addElement(2,22);
tab.addElement(3,23);
tab.addElement(4,24);
tab.print();