Redefinition des méthodes
Java
♦ L’habilité du programmeur à customiser la définition des méthodes de la
superclasse est connu sous le nom de redéfinition. C’est une autre
composante de l’héritage. N’importe quelle méthode héritée peut être
redéfinit, sauf les méthodes non privées qui ont été déclarées final dans la
classe de base
♦ Critères de redéfinition des méthodes de la superclasse:
• La méthode de base ne peut être redéfinit qu’une fois dans la sous-classe
• Les listes d’arguments des méthodes qui ont été redéfinit doivent être de
même type et listés dans un ordre identique. Sinon elles sont considérées
comme des méthodes surchargées
• Le type de retour de la méthode de base doit être identique à celui de sa
version redéfinit dans la sous-classe
• L’accessibilité ne peut être plus restrictive que la méthode original
• Les exceptions sont des classes spécialisées dans la détermination
d’erreurs ou de problèmes qui surgissent quand une méthode s’exécute.
Une méthode redéfinie ne peut envoyer des exceptions autres que celles
envoyées par la même class de la méthode original
Redefinition des méthodes
Java: Exemple de méthodes redéfinies
♦ Supposons une superclasse Animal, ses sous-classes héritent de la
méthode eat, Ainsi, la méthode eat a été redéfinit dans chacune des
sous-classes. La méthode walk est utilisée par les deux objets Spider et
cat, elle décrit combien de genoux sont utilisés pour marcher. En
revanche, comme l’objet fish ne marche pas, cette méthode est redéfinit
dans la class fish
Comparaison de la surcharge et de la redéfinition des méthodes
Java
Surcharge Redéfinition
Méthode doit être dans la même classe Méthode doit être dans la sous-classe
Méthode doit avoir le même nom mais Méthode doit avoir le même nom et les
des paramètres différents (l’ordre ou/et mêmes paramètres (en terme d’ordre et
le type des paramètres) de type de paramètres)
Le type de retour peut être différent (un Le type de retour doit être le même
type de retour différent seul n’est pas
suffisant pour les méthodes
surchargées, les paramètre doivent
aussi être différents)
Les signatures des méthodes sont Les signatures des méthodes sont
différentes identiques
Le modificateur d’accès de la méthode Le modificateur d’accès de la méthode
peut être plus privé que celui de la ne peut être plus privé que celui de la
méthode originale méthode originale
Les exceptions peuvent être différentes Les méthodes doivent envoyer des
(des exceptions différentes ne sont pas exceptions qui sont de même nature
assez pour les méthodes surchargées. que ceux de la méthode mère
Les paramètres doivent être différents)
Les méthodes peuvent éjecter plus Les méthodes ne peuvent envoyer plus
d’exceptions que la méthode original d’exceptions que la méthode de base
(un nombre différent d’exceptions seul qu’elles redéfinissent
n’est pas assez pour la surcharge des
méthodes, les paramètres doivent aussi
être différents)
Polymorphisme
Polymorphisme dans la création d’objet
♦ Polymorphisme veut dire “plusieurs formes”, il permet à un même code
d’avoir différents effets au moment de l’exécution et ceci en fonction du
contexte. Le polymorphisme prend avantage de l’héritage et de
l’implémentation des interfaces
♦ Il arrive qu'on veuille traiter un objet non en tant qu'objet du type
spécifique qu'il est, mais en tant qu'objet de son type de base. Cela
permet d'écrire du code indépendant des types spécifiques
♦ Par exemple, supposons qu’on veut créer une liste contenant des Prof,
Directeurs, Secrétaires, tous dérivant de Employe et dont chacune
possède sa propre méthode getDetails
Il suffit donc de créer un tableau de type Employe: Employe T[1...100]
On peut remplir ce tableau de Prof, Directeur, Secrétaire, etc. Ensuite
pour avoir les détails (par exemple) de la 5ième employée du tableau, il
suffit d’utiliser T[5].getDetails(…). On a pas besoin de savoir de quelle
employée il s'agit; on se contente de récupérer les détails via la
spécification du type de la classe de base
Polymorphysme
Exemple de Polymorphisme (1)
Employe
+ getDetails(return id, name);
// définition de la classe
//
Employe e1 = new Employe();
Prof Prof p1 = new Prof();
+getDetails(return id, name, class, grade); Employe e2 = new Prof();
L’appel de [Link] et [Link] traduisent différents
comportements et retournent différents résultats. L’objet référencé par
e2 est un exemple de polymorphisme. La variable e2 est de type
Employe. L’objet crée et la référence affectée à e2 est un objet Prof.
Au moment de l’exécution, [Link]() résultera dans l’invocation
de la méthode getDetails de l’objet Prof
Polymorphysme
Exemple de polymorphisme (2)
Une méthode qui reçoit
un type d’objet, peut être
appelée avec des objets
qui sont des sous-
Objet Employe comme argument classes de ce type, mais
pas avec des objets
superclasses de ce type
Ces instructions passent car
Prof est un Employe
Objet Prof comme argument
Objet Employe n’est pas
toujours un objet Prof
Cette instruction passe car
elle référence un objet Prof
Polymorphysme
Virtual method invocation (VMI)
Édition de lien dynamique (Dynamic
binding) détermine quelle méthode il
faut appeler au moment de l’exécution;
quand la méthode est implémenté par
plus d’une classe dans l’hiérarchie
d’héritage. JVM considérera le type de
l’objet effectivement crée et pas le type
avec lequel il a été déclaré:
Employe e2 = new Prof();
[Link]();
La technique de
résolution des arguments
passés à une méthode
est aussi connu sous le
nom de Dynamic
binding. JVM considère
uniquement le type
d’objet passé.
La technique de résolution
des comportements d’un
objet au moment de
l’exécution est connu sous le
nom de Virtual method
Invocation ou Dynamic
method binding