polymorphisme

polymorphisme - PHP - Programmation

Marsh Posté le 31-07-2005 à 10:34:39    

j'ai lu des articles a propos du polymorphisme (dont classe abstraire + interface) en POO, mais j'ai du mal a comprendre.
 
quelqu'un pourrait m'expliquer quel est l'interet et comment ca marche (si possible en PHP) ?
 
pour ma part j'ai fait un code pour essayer de piger :
est ce que le code suivant est un cas de polymorphisme :
 

Code :
  1. <?php
  2. class animal {
  3.    
  4.   private $cri;
  5.  
  6.      function __construct() {
  7.      }
  8.    
  9.     function crier() {
  10.        
  11.         return $this->cri;
  12.     }
  13.    
  14.    
  15. }
  16. $new_animal = new animal();
  17. echo $new_animal->crier();
  18. ?>


 

Code :
  1. <?php
  2. require_once("animal.php" );
  3. class renard extends animal {
  4.    
  5.     function __construct() {
  6.    
  7.         $this->cri = "glapir";
  8.  
  9.     }
  10.    
  11.     function crier(){
  12.    
  13.      return $this->cri;
  14.     } 
  15. }
  16. $new_renard = new renard();
  17. echo $new_renard->crier();
  18. ?>


 

Code :
  1. <?php
  2. require_once("animal.php" );
  3. class loup extends animal {
  4.    
  5.    
  6.     function __construct() {
  7.    
  8.         $this->cri = "aboyer"; 
  9.     }
  10.    
  11.    function crier(){
  12.    
  13.      return $this->cri;
  14.     } 
  15. }
  16. $new_loup  = new loup();
  17. echo $new_loup->crier();
  18. ?>



Message édité par jokari34 le 31-07-2005 à 10:52:46
Reply

Marsh Posté le 31-07-2005 à 10:34:39   

Reply

Marsh Posté le 31-07-2005 à 10:56:57    

je pense que tel que presenté c plutot de la redondance, car chaque redéfinition de la methode crier() a le meme contenu.
que faudrait il faire pour entre dans le cadre d'un polymorphisme ?
que chaque re définiton de crier() affecte au membre $cri une valeur différente, au lieu de donner cette tache au constructeur de la classe ?

Reply

Marsh Posté le 31-07-2005 à 11:00:57    

l'interet, c'est dans l'utilisation
 
 

Code :
  1. function mettre_en_cage ( ma_bestiolle ) {
  2. echo ma_bestiolle->crier();
  3. }


 
et essaye avec ça comme exemple :  

Code :
  1. mettre_en_cage($new_loup);
  2. mettre_en_cage($renard);


 
tu fais une seule fonction mettre_en_cage, pour tous les types d'animaux
 
(alors que normalement, tu aurais du faire : mettre_en_cage_loup, mettre_en_cage_renard, etc)


Message édité par zapan666 le 31-07-2005 à 11:02:06

---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 31-07-2005 à 11:20:07    

jokari34 a écrit :

je pense que tel que presenté c plutot de la redondance, car chaque redéfinition de la methode crier() a le meme contenu.
que faudrait il faire pour entre dans le cadre d'un polymorphisme ?


Tu ne dois pas ré-écrire la méthode crier de Animal dans chaque descendant Renard, Loup, ... Ces derniers héritent de la méthode de leur parent Animal.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 31-07-2005 à 11:23:42    

la seule fonction mettre_en_cage  je la crée ou  ?

Reply

Marsh Posté le 31-07-2005 à 11:24:25    

apparemment dapres Sircam je dois la créer dans la classe animal

Reply

Marsh Posté le 31-07-2005 à 11:27:49    

jokari34 a écrit :

la seule fonction mettre_en_cage  je la crée ou  ?


 
C'est juste un exemple...Tu peux la mettre dans un objet Cage  [:petrus75]
Sircam n'a pas dit que tu devais la mettre dans Animal : il a dit, ça sert a rien de redéfinir les fonctions crier dans Renard et Loup, car c'est la même dans Animal.
 
Tu dois redéfinir la fonction que si elle est différente. (mais un renard, ça crie comme un loup, non ?  [:aztechxx] )  


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 31-07-2005 à 11:30:07    

ok
- mettre_en_cage prend comme argument ma_bestiole.
- ma_bestiole correspond a une nouvelle instance de la classe renard.
et comme la sous classe renard herite de la methode crier() de la classe animal, mettre_en_cage demande l'affichage du cri de l'objet animal indiqué.
 
je vois donc pas vraiment où est la différence entre polymorphisme et héritage, sachant que tout simplement, la methode mettre_en_cage() définie dans la classe mère animal est héritée dans les 2 sous classes renard et loup.

Reply

Marsh Posté le 31-07-2005 à 11:35:19    

le principe consisterait donc a utiliser une seule methode qui servira a toutes les sous classes heritant d'une classe mere commune , mais dont le traitement exploitera des données différentes (données provenant d'un objet passé en parametre)
 
par contre, si une sous classe a besoin de la methode mettre_en_cage() avec son contenu d'origine  mais a besoin d'y ajouter quelques trucs en plus, comment je fais ?

Reply

Marsh Posté le 31-07-2005 à 11:57:10    

Tu fais un mettre_en_cage($a){
$super->mettre_en_cache($a);
// Ce que tu veux rajouter  
}
 
Edit: J'étais resté en mode Java...


Message édité par esox_ch le 31-07-2005 à 11:57:35

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 31-07-2005 à 11:57:10   

Reply

Marsh Posté le 31-07-2005 à 11:57:53    

tu la redéfini en appelant la fonction parente
 

Code :
  1. function mettre_en_cage() {
  2. parent::mettre_en_cage()
  3. echo "lkjlkj";
  4. }


 
(grosso modo, ça doit être ça en php5, tu devrais trouver ça ici :  
http://doc.domainepublic.net/php/d [...] .oop5.html


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 31-07-2005 à 11:59:36    

ok tu inclus la methode de base dans une nouvelle methode.

Reply

Marsh Posté le 01-08-2005 à 08:55:46    

p'tite question : si je rajoute un argument spécifique dans une fonction hérité, ça pose un problème ou pas ? (J'ai pas essayé..j'ai eux l'idée dans le train ce matin [:petrus75] )
 
exemple :
 
Classe parente  

Code :
  1. class bidule {
  2. function machin (arg1) {
  3. }
  4. }


 
Classe fille :  

Code :
  1. class truc {
  2. function machin (arg1, arg2 = null) {
  3. }
  4. }


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 01-08-2005 à 10:32:33    

Si je me trompe pas, il y a pas de problemes ... Le constructeur de la classe fille sera celui defini dans celle-ci et celui de la classe parente ne sera pas pris en compte ... Salopperie de PHP qui connais pas la surcharge de methodes/constructeur :D


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 01-08-2005 à 10:40:05    

esox_ch a écrit :

Si je me trompe pas, il y a pas de problemes ... Le constructeur de la classe fille sera celui defini dans celle-ci et celui de la classe parente ne sera pas pris en compte ... Salopperie de PHP qui connais pas la surcharge de methodes/constructeur :D


faut dire aussi qu'il n'y a pas de type en php, alors la surcharge, c'est chaud [:petrus75]
 

Code :
  1. function __construct( un_entier ) {
  2. }
  3. function __construct ( un_string) {
  4. }


 
C'est chaud de faire la différence entre les deux constructeurs [:petrus75]
(par contre, il est vrai que la surcharge sur le nombre d'argument, ça sera un petit plus déjà )
 
 


---------------
my flick r - Just Tab it !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed