INF1563 Programmation I
La surcharge
Redéfinition des champs
- les champs déclarés dans la classe dérivée sont toujours des champs supplémentaires
- si l'on définit un champ ayant le même nom qu'un champ de la classe de base, il existera deux
champs de même nom et le nom de champ désignera celui déclaré dans la classe dérivée
- pour avoir accès au champ de la classe de base, il faut
- changer le type de la référence pointant sur l'objet, ou
- utiliser
super
Exercice
class X {
public int i;
}
class Y extends X {
public int i;
public void methode(){
i = 0; // champ défini dans Y
this.i = 0; // champ défini dans Y
super.i = 1; // champ défini dans X
((X)this).i = 1; // champ défini dans X
}
}
class Z extends Y {
public int i;
public void methode(){
i = 0; // champ défini dans
this.i = 0; // champ défini dans
super.i = 1; // champ défini dans
((Y)this).i = 1; // champ défini dans
((X)this).i = 1; // champ défini dans
}
}
Redéfinition des méthodes (polymorphisme d'héritage)
- une classe dérivée peut fournir un nouveau comportement d'une méthode
- la méthode redéfinie a la même signature (le même nombre d'arguments et
les mêmes types des arguments) que la classe mère
Exemple :
public class Rectangle {
double a, b;
double perimetre(){
return 2*a + 2*b;
}
public String toString(){
return "Rectangle(" + a + "," + b + ")";
}
}
class Carre extends Rectangle {
// a = b
double perimetre(){
return 4*a;
}
public String toString(){
return "Carre(" + a + ")";
}
}
Généricité (polymorphisme paramétrique)
- permet de définir plusieurs fois une même méthode avec des arguments différents
- le compilateur choisit la méthode qui doit être appelée en fonction du nombre et
du type des arguments
Exemple :
// calculer la somme des entiers entre premier et dernier
int somme(int premier, int dernier){
...
}
// calculer la somme des réels entre premier et dernier avec delta étant 0.1
double somme(double premier, double dernier){
...
}
//calculer la somme des réels entre premier et dernier avec delta donné
double somme(double premier, double delta, double dernier){
...
}
Polymorphisme ad hoc
- permet d'avoir des fonctions de même nom, avec des fonctionnalités similaires, dans des classes sans aucun rapport entre elles
- exemple : afficher dans les classes Beaute, Message et Amour
Note
Le nom de polymorphisme vient du grec et signifie qui peut prendre plusieurs formes.