En général on considère l’héritage quand on veut créer un cas particulier d’un chose Ex : superclass Vehicule ⇒ sous classe Voiture, Avion, …
MAIS est-ce toujours judicieux d’un point de vue qualité du code, performance ? Exemple illustratif Rectangle et Carré:
Si on veut le principe général, on obtient carré = cas particulier d’un Rectangle
Carré hérite de 2 attributs, ce qui est 1 de trop ⇒ pas top pour l’utilisation mémoire Cela dit, il est possible de déclarer un des 2 attributs en private pour ne pas en hériter. Mais dans ce cas on doit redéfinir dans carré toutes les méthodes qui vont manipuler cet attribut.
classDiagram
Rectangle <|-- Carré
class Rectangle {
double largeur
double longueur
}
class Carré {
}
En conclusion, sur cette solution, on peut sauvegarder de la mémoire mais en écrivant lpus de code
On sort du principe général
Mais dans ce cas, on a également besoin de redéfinir les méthodes qui dans Rectangle ont besoin de largueur pour fonctionner
classDiagram
Carré <|-- Rectangle
class Carré {
double largeur
}
class Rectangle {
double longueur
}
Ces 2 solutions sont en apparence identiques et c’est plutôt :
qui va déterminer quelle solution est meilleure pour l’application ciblée
Quand il y a une hierarchies de classe, par ex C hérite de B, qui hérite de A, la construction d’une instance d’une sous classe soit un mécanisme précis qui peut dépendre du langage.
⇒ pour construire une instance de C, il faut “en gros” d’abord construire une instance de A, qui va permettre de construire une instance de B, puis de C. Cela est possible à chaque constructeur d’une sous-classe appelle comme 1ère construction un des constructeurs de sa super-classe directe.
En Java, cet appel ce fait grace au mot clef super
class A {
protected int i, double d;
public A() {
i=0;
d=0;
}
public A(double d) {
i=0;
thisd=d;
}
public A(int i, double d) {
this.i = i;
thisd=d;
}
}
class B extends A {
...
public B() {
super(-1, -1);
}
public B(double d) {
super(d);
}
}
class C extends B {
public C() {
super(3.14)
}
}
<aside> ⚠️
super doit être la 1ère instruction
</aside>