Hériter de qui et pourquoi ?

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é:

Cas n°1

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

Cas n°2

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
    }

Conlusion

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

Principe de construction

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>