DY

DelahayeYourself

modules / M2104 /

TP07: 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
UML class diagram
Diagramme UML des classes Dinosaures

Il va donc falloir modifier notre classe Dinosaur pour la rendre abstraite et la dériver en quatre classes filles (Diplodocus, Stegausaurus, 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

Unit test UML class diagram
Diagramme UML de classe des tests unitaires
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
  1. A vous de jouer, implémenter les quatre classes définit au sein du diagramme.
  2. 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
}
  1. Relancer vos tests,
  2. 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
}
  1. Surcharger la propriété Specie de chacune de vos classes,
  2. Relancer vos tests,
  3. 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:

UML class diagram
Diagramme UML
  1. Marquer la méthode SayHello comme virtuel,
  2. Implémenter une surcharge pour la méthode SayHello de chaque classe de dinosaure,
  3. Penser à mettre à jour vos T.U.