Séance F : Héritage multiple et interfaces
Dernière mise à jour
Dernière mise à jour
Interface : Une interface ne possède ni propriétés, ni définition de méthodes. Elle ne contient que la déclaration de méthodes. Il est ainsi possible de "passer un contrat de développement" dans lequel une classe qui implémente une interface aura pour obligation qu’elle définisse les méthodes. Donc, en tant que développeur, on s’engage à définir convenablement les méthodes déclarées dans l’interface. Si, on venait à ne pas respecter cet engagement, PHP nous le signalerait par une erreur.
Interface multiple : une classe peut implémenter plusieurs interfaces.
Méthodes : une classe qui implémente une interface peut déclarer et définir des méthodes qui ne figurent pas dans l’interface.
Convention de nommage : le nom de l’interface a pour initiale la lettre i minuscule.
Soit la classe Personne et une interface iPersonne
Soit une application instanciant la classe Personne
L’exécution de cette application provoquera l’erreur suivante
car les méthodes sePresente() et travaille() n’ont pas été définies dans la classe Personne. Le contrat n’a pas été respecté !
Nous pourrions proposer ce code :
L’héritage est le moyen de spécialiser une classe sans compromettre son code original. PHP autorise l’héritage multiple. Une classe pouvant être une classe fille mais aussi une classe parent. (cf. exemple ci-dessous)
Dans l'exemple ci-dessus, la classe B hérite de la classe A. La classe C hérite de la classe B.
Evidemment l’héritage multiple a fonctionnellement des limites. On peut souhaiter interdire l’héritage afin de conserver une certaine intégrité du code. C’est possible si on place le mot clé final devant le nom de la classe. (cf. exemple ci-dessous)
Dans l'exemple ci-dessus, on ne pourra pas créer de classes à partir de la classe C. L’héritage est interdit.
une classe abstraite ne peut pas être instanciée. L’héritage devient alors le seul moyen pour exploiter ses propriétés et ses méthodes. Les classes filles pouvant alors être instanciées. (cf. exemples ci-dessous).
Classe abstraite, mot-clé abstract.
Dans l'exemple ci-dessus, la classe A est abstraite. Elle ne peut pas être instanciée. Le code ci-dessous montre que l’instanciation de la classe A provoque une erreur PHP : Fatal Error, cannot instanciate abstract class A
L’intérêt de la classe Abstraite est de fournir un code de base (une sorte de modèle) commun à un ensemble de classes. Mais ce code n’est pas complet pour pouvoir l’utiliser directement. L’héritage est donc la seule solution de développement.
Ci-dessus, application, classe abstraite, instanciation impossible.
une classe peut posséder des propriétés statiques. Ces propriétés ne sont pas des propriétés liées aux objets, mais des propriétés de classe. Il est ainsi possible d’exploiter cette caractéristique pour connaître par exemple le nombre d’instances créées. Cela s’avère particulièrement utile lors de la mise en œuvre de l’héritage. Mais pas seulement. (cf. exemples ci-dessous)
Dans le code ci-dessus, il est possible de connaître le nombre d’instances (objets) créées.
Voici la représentation UML du diagramme des classes à créer dans cet exercice.
Créer la classe Abstraite VehiculeAMoteur dont les caractéristiques sont les suivantes :
Propriétés
Type de moteur (propriété encapsulée)
Nombre de passagers (propriété encapsulée)
Nombre de véhicules (propriété de la classe : Static)
Méthodes
Le constructeur
verificationtype($type)
: cette méthode permet de vérifier que l’utilisateur de la classe utilisera bien le bon code pour la propriété Type moteur. Il vaut soit T, soit E. (T pour Thermique, E pour Electrique)
verificationnbpassagers($nombre)
: cette méthode permet de vérifier que l’utilisateur de la classe affecte bien une valeur numérique (un entier) au nombre de passagers.
Avec l'utilisation de PHP 8 et versions suivantes et l'usage du typage, la méthode verificationnbpassagers
n'a plus forcément de sens, le passage d'une donnée autre qu'un entier provoquerait une erreur PHP
Créer la classe Voiture qui hérite de la classe VehiculeAMoteur dont les caractéristiques sont les suivantes :
Propriétés
Marque du véhicule
Puissance en chevaux
Méthodes
Le constructeur
Lirecaracteristiques()
qui retourne :
Le type de moteur,
Le nombre de passagers
La marque
La puissance
Créer la classe VoitureDeSport qui hérite de la classe Voiture. Il ne doit pas être possible de créer des classes filles à partir de la classe VoitureDeSport.
Propriété :
Nb de secondes de zéro à 100 km/h
Méthodes :
Le constructeur
Lirecaracteristiques()
héritée de la classe Voiture et qui affiche en plus le nombre de secondes de zéro à cent.
Créer la classe VoitureTourisme qui hérite de la classe Voiture dont les caractéristiques sont les suivantes :
Propriétés :
Consommation en litres pour 100 kilomètres.
Kilométrage, valeur définie par défaut à 0 km.
Méthodes :
Le constructeur, toutes les propriétés ne sont pas nécessaires dans le constructeur.
Lirecaracteristiques()
héritée de la classe Voiture et qui retourne en plus la consommation et le kilométrage.
utiliser($distance)
: incrémente le kilométrage dun nombre de kilomètres donné en argument ($distance
)
Créer la classe Camion qui hérite de la classe VehiculeAMoteur dont les caractéristiques sont les suivantes :
Propriétés :
Tonnage
Nombre d’essieux
Méthodes
Le constructeur
lirecaracteristiques()
qui retourne :
Type moteur,
Nombre de passagers
Le tonnage
Le nombre d’essieux
Voici le code de l’application attendue. A saisir et à tester.