Classe abstraite : Mise en pratique
Dans cette mise en pratique, nous allons voir comment déclarer et utiliser des Classes Abstraites en PHP
. Les classes abstraites sont un élément important de la programmation-objet, pour rappel :
- Sers de base à d'autres classes dérivées (héritées).
- Ne peut pas être instanciée (pas de new).
- Permets de factoriser du code.
- Les classes abstraites ne sont pas instanciable
- Dois être héritée depuis une classe fille.
Sommaire
Ressources disponibles :
Mise en situation
abstract class EtudiantAbstrait
{
// Force les classes filles à définir cette méthode
abstract protected function getSpecificite();
abstract protected function setSpecificite($valeur);
// méthode commune
public function parler() {
print "Je suis " . $this->getSpecificite() . "\n";
}
}
Questionnement
- Une classe
abstraite
est définie avec le mot clé : - Identifier les particularités de la classe
EtudiantAbstrait
- Particularité 1 :
- Particularité 2 :
- Particularité 3 :
- D'un point de vue sécurité, qu'apporte cette organisation ? (Une piste, encapsulation…)
- Selon vous, pourquoi la classe abstraite ne possède-t-elle pas de constructeur ?
Déclarer les classes
Pour utiliser une classe abstraite, nous allons devoir « hériter » de celle-ci avec les mots clés que vous connaissez déjà :
extends
en php et en java.:
en C#.
La différence avec un simple héritage, c'est que vous devrez « implémenter » / « écrire » les deux méthodes :
getSpecificite()
setSpecificite($valeur)
Et la méthode parler ?
Pour la méthode parler()
c'est au choix. Vous pouvez :
- La redéfinir dans votre classe pour en changer le comportement.
- Ne pas la redéfinir et bénéficier du comportement de « base de la classe abstraite ».
Questionnement
- Écrire la définition de la classe pour
EtudiantSIO
. - Écrire la définition de la classe pour
EtudiantSEN
. - Quelle différence majeure observez-vous entre la classe abstraite
EtudiantAbstrait
et les classes filles ?
Utilisation
Je souhaite créer 6 étudiants (3 SEN et 3 SIO).
Pour les SEN ils doivent avoir les compétences suivantes
- La sécurité.
- La soudure.
- Le réseau.
Pour le SIO ils doivent avoir les options suivantes :
- SLAM
- SISR
- SLAM
Vous placerez ces étudiants dans une liste. Puis pour chacun d'entre eux, vous appellerez la méthode parler()
.
Questionnement
- Identifier l'avantage d'une classe abstraite VS un simple héritage.
- Faire évoluer le code pour ajouter le
nom
et leprenom
de l'étudiant.- Quelle(s) classe(s) seront impactées ?
- Et de quelle manière ?
Redéfinir une méthode
Après réflexion, vous souhaitez changer le comportement de la méthode parler()
pour les étudiants de la classe EtudiantSIO
.
Vous souhaitez que le message soit le suivant :
Je suis un étudiant SIO et je suis spécialisé en sécurité.
Questionnement
- Identifier les modifications à apporter au code.
- Écrire le code pour la classe
EtudiantSIO
.
Évolution du code
Vous souhaitez ajouter l'identifiant de l'étudiant :
- nom
- prénom
Questionnement
- Quelles classe(s) seront impactée(s) ?
- Quelles modifications apporter au code ?
- Écrire le code permettant d'ajouter ces informations.
- Devez-vous modifier la méthode
parler()
?
Analyser une erreur
Un développeur souhaite créer un Étudiant, il a donc écrit le code suivant :
$etudiant = new EtudiantAbstrait();
En exécutant ce code, vous obtenez l'erreur suivante :
Cannot instantiate abstract class EtudiantAbstrait
Questionnement
- Identifier la raison de cette erreur.
- Identifier la solution pour contourner cette erreur.