IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Héritage : instancier un objet fille à partir d'une instanciation de la mère


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut [POO] Héritage : instancier un objet fille à partir d'une instanciation de la mère
    Bonjour,

    En quelques termes imagés, voilà mon problème :
    supposons que j'ai une classe mère Voiture dont hérite les classes Renault et Peugeot. Ma classe Voiture est instanciée à partir d'un fichier de données (XML), dans lequel est spécifié, entre autre, la marque du véhicule. Je n'ai pas de moyen simple d'accéder à cette information à partir de mon fichier de donnée, mais une fois ma classe mère instanciée, je peux très facilement l'obtenir. Mon problème devient évident : j'ai besoin d'instancier ma classe mère Voiture pour pouvoir obtenir l'info qui me permettrait de savoir quelle classe fille utiliser pour instancier mon objet : je dois avoir la voiture sous les yeux pour déterminer sa marque. Donc : est-il possible, une fois un objet mère instancié de le "caster" en objet fille, sans avoir à instancier à nouveau l'objet ?

    Et si, comme je le soupçonne, ça n'est pas possible, connaissez vous une "bonne pratique", un design pattern, permettant de résoudre élégamment ce problème.

    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Pour la bonne pratique il faut regarder le pattern d'usinage je pense (factory).

    Dans les faits, une voiture étant une voiture ? Qu'est censée représenter la classe Fille ? Les voitures de la marque renault ? Les quatres - quatres ?
    Si c'est l'idée cela ne me semble pas être la bonne piste.
    Une 2cv, ou un 44, à toujours 4 roues, effectue les braquages de la même manière, ce voit appliquer les couleurs de la même manière ect.

    bye

  3. #3
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Par défaut
    Dès la lecture de ton post j'ai tiqué.
    Effectivement, comme le dit Kaymak, la marque de voiture est une propriété de la voiture, et non une extension de possibilités.

    Si c'est l'exemple qui est pas bon, mais que ton pb reste le même, je ferais effectivement un factory directement dans la classe voiture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class voiture {
     
        public static function factory() {
            //traitement pour savoir quel objet retourner
            return new Renault; // par exemple
        }
    }
     
    class renault extends voiture {
    }
     
    et tu appelles par
    $mon_objet_ici_renault = voiture::factory();
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    Citation Envoyé par wamania Voir le message
    Si c'est l'exemple qui est pas bon, mais que ton pb reste le même, je ferais effectivement un factory directement dans la classe voiture
    Oui, l'exemple est mal choisi ; merci pour vos suggestions. Je vais regarder ça de plus près...

    Edit : le problème de la factory, c'est que ça ne m'évite pas d'effectuer deux fois le chargement du fichier XML en structure DOM (opération effectué par le constructeur de la classe voiture si je veux avoir accès à la marque de la voiture), non ? en terme de performance ça revient en gros à instancier voiture, tester le type de voiture, instancier renault.
    en plus, il y a un truc qui me chiffonne, c'est qu'alors Voiture doit connaitre toutes les classes potentielles qui peuvent hériter d'elle.

  5. #5
    mon_nom_est_personne
    Invité(e)
    Par défaut
    un petit rappelle de la difference entre static et non static :
    - static interviens dans un contexte de classe.
    - non static dans un contexte de l'objet

    donc, quand tu sais ca il est tres facile de faire :

    tester et approuver, bon pour copier/coller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    class voiture {
        public static $monXml;
        public $constructeur;
     
        public static function Xml2Dom(){
            self::$monXml = array('renault' => 'r', 'nissan' => 'n');
        }
     
        public static function factory($nomFille) {
            //traitement pour savoir quel objet retourner
            return new $nomFille; // par exemple
        }
     
        public final function getMyXml()
         {
              return self::$monXml[$this->constructeur];
          }
    }
     
    class renault extends voiture {
     
         public function __construct(){
             $this->constructeur = "renault";
         }
     
    }
     
    class nissan extends voiture {
     
         public function __construct(){
             $this->constructeur = "nissan";
         }
     
    }
     
    voiture::Xml2Dom();
    $mon_objet_ici_renault = voiture::factory('renault');
    var_dump($mon_objet_ici_renault->getMyXml());
    $mon_objet_ici_nissan = voiture::factory('nissan');
    var_dump($mon_objet_ici_nissan->getMyXml());
    J'ai traite mon xml qu'une fois, j'ai ecrit une methode intelligement, et maintenant je laisse la machine travailler pour moi.
    pour plus d'info sur le pattern j'ai ecrit ce microscopique tuto, a la base c'etait pour expliquer les interfaces mais comme les deux sont relativement lies .
    http://www.developpez.net/forums/d60...nterfaces-php/
    Dernière modification par mon_nom_est_personne ; 09/09/2008 à 10h48.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    j'aurai rajouté une méthode static pour peupler l'objet voiture en fonction d'un tableau, ou d'un noeud XML (vu que c'est ce qui nous intéresse).

    Sinon c'est tout à fait cela.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    Citation Envoyé par mon_nom_est_personne Voir le message
    donc, quand tu sais ca il est tres facile de faire :

    tester et approuver, bon pour copier/coller
    Merci pour ces précisions et ces remarques ; je regarde dès que j'ai le temps...

Discussions similaires

  1. [POO] Héritage: caster en classe fille
    Par Grotoumaigr dans le forum Langage
    Réponses: 1
    Dernier message: 11/01/2012, 15h08
  2. objet File à partir d'une URL
    Par dasc82 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 14/01/2008, 15h28
  3. Réponses: 8
    Dernier message: 27/03/2007, 15h32
  4. Réponses: 4
    Dernier message: 16/01/2007, 13h42
  5. Réponses: 1
    Dernier message: 29/10/2006, 05h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo