02 Mar2016
Classe abstraite et ses dérivées - Classe Forme
Objectifs:
- Créer une classe abstraite et ses dérivées en php .
- implémenter des méthodes abstraites.
- Utiliser un attribut statique.
- Exploiter l'héritage.
Travail à faire :
On souhaite Créer un ensemble de classes permettant de manipuler des formes. Pour cela on propose la hiérarchie de classes suivante :
- La classe Point2D en php :
- Créer la classe Point2D caractérisée par 2 coordonnées x ,y.
- Définir les accesseurs ,et le constructeur d’initialisation.
- Ajouter à la classe la fonction magique __toString qui permet d’afficher les propriétés d’un objet Point2D sous la forme : Point(x =10,y =3)
- Ajouter à la classe une méthode bouger prenant en paramètre les deux réels dx et dy et qui permet de translater le point vers le point x+dx ,y+dy et z+dz.
- La classe abstraite Forme en php :
- La classe Forme possède un centre de type Point2D et un id.
- Lors de la création d’une Forme , son id est incrémenté selon le nombre de Formes créés.
- Ajouter à la classe les deux méthodes abstraites surface() et périmètre().
- Ajouter la méthode bouger() qui fait tout simplement appelle à la méthode bouger() de son centre.
- La classe Rectangle en php :
- Créer la classe Rectangle dérivée de la classe Forme et caractérisée par deux attributs : largeur et longueur .
- Ajouter les accesseurs et un constructeur d’initialisation à la classe.
- Définir la méthode surface qui renvoie la surface d’un objet rectangle : largeur*longueur.
- Définir la méthode périmètre qui renvoie le périmètre d’un objet rectangle : 2*(largeur+longueur).
- La méthode __toString() représente chaque rectangle sous la forme :
{Rectangle :1 //1 est l'id de la forme
Centre:Point(x=2, y=3)
Largeur:1
Longueur:2
surface:2
perimetre:6
}
- La classe Cercle :
- Créer la classe Cercle qui hérite de la classe Forme et qui possède en plus un rayon.
- Ajouter les accesseurs et un constructeur d’initialisation .
- Définir la méthode surface qui renvoie la surface d’un objet cercle : π*r2
- Définir la méthode périmètre qui renvoie le périmètre d’un objet rectangle : 2 *π*r
- La méthode __toString() représente chaque cercle sous la forme : {Cercle :2
{Cercle :2
Centre:Point(x=3, y=3)
Rayon:2
surface:12.57
perimetre:12.57
} - La classe Carré :
- Créer la classe Carré qui hérite de la classe Rectangle (un carré est un rectangle avec largeur = longueur).
- La classe Carré ne pourra pas être dérivée.
- Attribuer à la classe un constructeur d’initialisation .
- La méthode __toString() représente chaque carré sous la forme :
{Carre :3
Centre:Point(x=3, y=3)
Longueur:1
surface:1
perimetre:4
}
- Ecrire un script de Test :
{Rectangle :1
Centre:Point(x=2, y=3)
Largeur:1
Longueur:2
surface:2
perimetre:6
}{Cercle :2
Centre:Point(x=1, y=2)
Rayon:2
surface:12.57
perimetre:12.57
}//Après déplacement du cercle par (dx=2,dy=1){Cercle :2
Centre:Point(x=3, y=3)
Rayon:2
surface:12.57
perimetre:12.57
}{Carre :3
Centre:Point(x=3, y=3)
Longueur:1
surface:1
perimetre:4
}
- Script de la classe Point2D.class.php
<?php class Point2D { private $x; private $y; //getters et setters public function set_x($x){ $this->x=$x; } public function get_x(){ return $this->x; } public function set_y($y){ $this->y=$y; } public function get_y(){ return $this->y; } //constructeur public function __construct($x,$y){ $this->x=$x; $this->y=$y; } //Fonction "bouger" déplace les coordonnées du point par les valeurs dx et dy. public function bouger($dx,$dy){ $this->x+=$dx; $this->y+=$dy; } public function __toString(){ return "Point(x=".$this->x.", y=".$this->y.")"; } }
-
Script de la classe abstraite Forme.class.php
<?php //déclaration de la classe abstraite abstract class Forme{ //déclaration d'un attribut statique $compteur initialisé à 0. private static $compteur=0; //Déclaration des attributs protégés protected $id; protected $centre; //Déclaration des méthodes abstraites abstract function surface(); abstract function perimetre(); //Méthode bouger() appelle la méthode bouger() du centre . public function bouger($dx,$dy){ if($this->centre instanceof Point2D) $this->centre->bouger($dx,$dy); } //Le constructeur qui sert à incrémenter la variable de la classe $compteur,ce dernier sera affecter à l'id de la forme encours de création. public function __construct(){ self::$compteur++; $this->id=self::$compteur; } }
-
Script de la classe Rectangle.class.php
<?php class Rectangle extends Forme{ protected $largeur; protected $longueur; function __construct($la,$lo,Point2D $centre){ //Appel du constructeur parent (Forme) pour incrémenter le compteur et attribuer sa valeur à l'id parent::__construct(); $this->largeur=$la; $this->longueur=$lo; $this->centre=$centre; } //Implémentation des méthodes surface() et perimetre() function surface(){ return $this->largeur*$this->longueur; } function perimetre(){ return 2*($this->largeur+$this->longueur); } function __toString(){ return "<pre>{Rectangle :".$this->id. "<br> Centre:".$this->centre. "<br> Largeur:".$this->largeur . "<br> Longueur:".$this->longueur. "<br> surface:".$this->surface(). "<br> perimetre:".$this->perimetre(). "<br>}</pre>"; } }
-
Script de la classe Cercle.class.php
<?php class Cercle extends Forme{ private $rayon; function __construct($r,Point2D $centre){ parent::__construct(); $this->rayon=$r; $this->centre=$centre; } function surface(){ return round(pow($this->rayon,2)*M_PI,2); } function perimetre(){ return round(2*$this->rayon*M_PI,2); } function __toString(){ return "<pre>{Cercle :".$this->id. "<br> Centre:".$this->centre. "<br> Rayon:".$this->rayon . "<br> surface:".$this->surface(). "<br> perimetre:".$this->perimetre(). "<br>}</pre>"; } }
-
Script de la classe Carre.class.php
<?php //Le mot clé final implique que la classe ne pourra pas être dérivée. final class Carre extends Rectangle{ function __toString(){ return "<pre>{Carre :".$this->id. "<br> Centre:".$this->centre. "<br> Longueur:".$this->largeur. "<br> surface:".$this->surface(). "<br> perimetre:".$this->perimetre(). "<br>}</pre>"; } }
-
Script php de test :
<?php include_once("Point2D.class.php"); include_once("Forme.class.php"); include_once("Rectangle.class.php"); include_once("Carre.class.php"); include_once("Cercle.class.php"); $p1=new Point2D(2,3); $p2=new Point2D(1,2); $rect1= new Rectangle(1,2,$p1); $cercle1=new Cercle(2,$p2); $carre1=new Carre(1,1,$p2); echo $rect1; echo $cercle1; //faire bouger le cercle $cercle1->bouger(2,1); echo $cercle1; echo $carre1;