Junior
Quelle est la nature d'une classe abstraite?
sobes.tech IA
Réponse de l'IA
L'objectif d'une classe abstraite est de servir de modèle pour d'autres classes. Elle ne peut pas être créée directement, mais peut contenir des méthodes abstraites (sans corps), qui doivent être implémentées dans les classes dérivées, ainsi que des méthodes et propriétés concrètes.
Points clés:
- Impossible de créer une instance:
new ClasseAbstraite()provoquera une erreur. - Héritage: On ne peut hériter que d'une classe abstraite (
extends). - Méthodes abstraites: Définissent l'interface que doivent implémenter les classes dérivées. Marquées par le mot-clé
abstractet sans corps. - Méthodes et propriétés concrètes: Peuvent être définies et utilisées directement, ainsi que redéfinies dans les classes dérivées.
- Implémentation partielle: Fournit une structure générale et une certaine fonctionnalité de base, laissant les détails d'implémentation à la discrétion des classes dérivées.
Exemple:
<?php
abstract class Forme {
protected $couleur;
public function __construct($couleur) {
$this->couleur = $couleur;
}
abstract public function calculerSurface(); // Méthode abstraite
public function obtenirCouleur() {
return $this->couleur;
}
}
class Cercle extends Forme {
private $rayon;
public function __construct($couleur, $rayon) {
parent::__construct($couleur);
$this->rayon = $rayon;
}
public function calculerSurface() {
return pi() * $this->rayon * $this->rayon;
}
}
class Carré extends Forme {
private $côté;
public function __construct($couleur, $côté) {
parent::__construct($couleur);
$this->côté = $côté;
}
public function calculerSurface() {
return $this->côté * $this->côté;
}
}
// Exemple d'utilisation
$cercle = new Cercle("Rouge", 5);
echo "Surface du cercle: " . $cercle->calculerSurface() . ", Couleur: " . $cercle->obtenirCouleur() . "\n";
$carré = new Carré("Bleu", 4);
echo "Surface du carré: " . $carré->calculerSurface() . ", Couleur: " . $carré->obtenirCouleur() . "\n";
// Le code suivant provoquera une erreur fatale : instanciation d'une classe abstraite
// $formeAbstraite = new Forme("Inconnu");
Tableau comparatif avec interfaces et classes normales:
| Caractéristique | Classe abstraite | Interface | Classe normale |
|---|---|---|---|
| Création d'une instance | Non | Non | Oui |
| Héritage | Oui (extends) + Implémentation (implements) |
Seulement Implémentation (implements) |
Oui (extends) |
| Méthodes | Concrètes et abstraites | Seulement abstraites (sans corps) | Seulement concrètes |
| Propriétés | Oui | Non | Oui |
| Héritage multiple | Non | Oui | Non |
| Objectif | Implémentation partielle, structure générale | Définition de contrat (comportement) | Implémentation complète, objet concret |
Utilisé lorsque des logiques et propriétés communes doivent être partagées par un groupe de classes liées, mais leur comportement spécifique (implémentation de certains méthodes) diffère. Permet la réutilisation du code et la cohérence dans la structure des classes.