08 L'héritage
Nous avons découvert en cours la notion d'héritage. Dans un premier temps il convient de donc de définir une classe mère en regroupant les caractéristiques en commun au sein d'une même classe.
Classe abstraite & héritage
Une classe abstraite est une classe qu'on ne peut instancier. Nous l'avons vu en cours il n'existe pas d'instance de dinosaure mais des instances de Diplodocus, Stégausaure, etc.
Ainsi une classe abstraite représente une définition abstraite qui sera commune à différentes classes.
Diagramme UML
Il va donc falloir modifier notre classe Dinosaur pour la rendre abstraite et la dériver en quatre classes filles (Diplodocus, Stegosaurus, TyrannosaurusRex, Triceratops).
Attention, rappelez-vous : 1 classe ➡️ 1 fichier.
Création des classes et modification de Dinosaur
Avant toute chose nous ne pouvons plus tester une classe abstraite, ainsi il va donc falloir implémenter pour chaque classe de dinosaure une classe de test.
Voici le diagramme UML des classes de test
- A vous d'implémenter ces différentes classes de tests.
Modification de la classe Dinosaur
Notre classe Dinosaur
étant désormais abstraite, il convient d'indiquer via le mot clé abstract:
public abstract class Dinosaur
{
// classe tronquée
}
Implémentation des classes de dinosaures
- A vous de jouer, implémenter les quatre classes définit au sein du diagramme.
- Si vous avez bien écrit les tests de la classe TestDinosaurs vous devriez avoir une erreur, pourquoi ?
Attributs statique & propriété
Un attribut statique est partagée par l'ensemble des instances d'une classe et des classes filles dont elles dérivent. Ainsi l'attribut statique specie
est commun à toutes les classes.
Pour corriger cela, nous allons donc créer une propriété au sein de la classe dinosaur:
public abstract class Dinosaur
{
protected virtual string Specie { get { return "Dinosaur"; } }
// la classe est tronquée, la propriété Specie remplace l'attribut statique specie
}
- Relancer vos tests,
- Que constatez vous ?
Surcharge
Il est possible et même conseillé d'utiliser la surchage en OOP, nous pouvons donc surcharger la propriété Specie
dans chacune des classes de nos dinosaures, par exemple pour le diplodocus:
public class Diplodocus : Dinosaur
{
protected override string Specie { get { return "Diplodocus"; } }
//Encore une fois la classe est tronquée
}
- Surcharger la propriété
Specie
de chacune de vos classes, - Relancer vos tests,
- Que constatez vous ?
Surchage de méthodes
En suivant le diagramme UML suivant, il convient de surcharger pour chaque classe de dinosaure la méthode Roar
:
- Marquer la méthode
SayHello
comme virtuel, - Implémenter une surcharge pour la méthode
SayHello
de chaque classe de dinosaure, - Penser à mettre à jour vos T.U.