Auto-héritage, c'est possible ? [POO] - PHP - Programmation
Marsh Posté le 16-11-2007 à 15:21:48
Design Pattern :: Factory
Marsh Posté le 16-11-2007 à 15:21:50
Ce que je lis a l'air de correspondre, mais j'ai du mal à voir concrètement comment l'appliquer en PHP, et comment ça s'utilise au final...
Je vois que ces exemple en C++
http://www.dofactory.com/Patterns/ [...] spx#_self1
Et ça a l'air vachement plus compliqué que mon exemple
Marsh Posté le 16-11-2007 à 15:23:05
sircam a écrit : Design Pattern :: Factory |
Ah, avec ça j'ai déja plus de résultats de recherche
Marsh Posté le 16-11-2007 à 15:25:10
Pattern "Factory Method" je dirais, et faut créer une autre classe parce que sinon c'est complètement dégueu (une classe mère n'a pas à être au courant du comportement de ses enfants )
Marsh Posté le 16-11-2007 à 15:26:57
masklinn a écrit : Pattern "Factory Method" je dirais, et faut créer une autre classe parce que sinon c'est complètement dégueu (une classe mère n'a pas à être au courant du comportement de ses enfants ) |
Sauf quand méthode abstraites toussa, sauf qu'on ne peut pas instancier une classe abstraite si je ne m'abuse
Marsh Posté le 16-11-2007 à 15:31:05
theredled a écrit : Sauf quand méthode abstraites toussa |
Whut?
Non, même là
theredled a écrit : sauf qu'on ne peut pas instancier une classe abstraite si je ne m'abuse |
Quel est le rapport avec la choucroutte?
Marsh Posté le 16-11-2007 à 15:43:40
En php, c'est assez simple, tu fais de l'héritage pour tes classe fille. Puis une fonction ou un objet qui prend comme paramètre le type d'objet que tu veux et qui instanciera le bon. Là, t'as en gros deux solutions :
Code :
|
Code :
|
Evidement, il faut vérifier l'existence de la classe demandé et filtrer pour ne pas créer n'importe quoi comme objet.
Marsh Posté le 16-11-2007 à 15:45:41
masklinn a écrit : |
Ben si, quand la classe mère définit des classes abstraites, elle est courant du comportement de ses enfants à ce niveau
masklinn a écrit : Quel est le rapport avec la choucroutte? |
Ben c'est toi qui me parlait de mon exemple, bref on s'en fout.
Marsh Posté le 16-11-2007 à 15:48:54
omega2 a écrit : En php, c'est assez simple, tu fais de l'héritage pour tes classe fille. Puis une fonction ou un objet qui prend comme paramètre le type d'objet que tu veux et qui instanciera le bon. Là, t'as en gros deux solutions :
|
Et du coup dans le constructeur je fais un "return $obj" ?
Marsh Posté le 16-11-2007 à 15:54:46
theredled a écrit : Ben si, quand la classe mère définit des classes abstraites, elle est courant du comportement de ses enfants à ce niveau |
Cette phrase n'a pas de sens. La classe mère est une classe abstraite, elle définit rien du tout et n'est pas au courant du comportement de ses enfants.
Marsh Posté le 16-11-2007 à 15:57:38
Ha j'avais pas compris ta demande comme ça.
Non, en php, on ne peut pas faire un "new Instrument(Guitare)" pour obtenir un objet de type "Guitare". Si tu fais ça, tu obtiendras toujours un objet de la classe Instrument quoi que tu fasses dans le constructeur.
La solution que j'indiquais correspond à une fonction (qu'elle appartienne où non à une classe) que t'appelle et qui te retourne un objet du type voulut.
Marsh Posté le 16-11-2007 à 16:04:17
Ca me fait penser...
En C#, est-ce qu'il est possible de connaître les classes qui héritent d'une classe ? (j'imagine en passant par la reflexion)
En fait, l'idée est simple :
La classe mère, au moment de l'appel d'une méthode "public static Instrument CreateInstrument(string NomIntrument)" parcours les classes héritées, et les interroge via une methode qu'on a défini en abstract dans la classe Instrument, et retourne une instance de la classe qui répond correctement.
Genre :
Code :
|
Ou un trucdu genre ?
Parceque du coup on pourrait faire, sans connaitre à l'avance les types hérités :
Code :
|
Marsh Posté le 16-11-2007 à 16:19:40
Vous reinventez tous la roue là
Y a pas a chier des perles. Pattern Factory et fisa
Marsh Posté le 16-11-2007 à 16:24:56
De ce que je comprends de Pattern Factory, c'est à chaque dev de venir toucher à la méthode dans la classe de base non ?
Ou alors t'as un petit lien/exemple à fournir ?
Parceque quand je cherche sur google, je suis pas convaincu par les résultats que je trouve : je vois pas trop l'intérêt du truc à la base (du moins je le trouve limité)
Par exemple celui-là :
http://www.c-sharpcorner.com/Uploa [...] sinCS.aspx
Moi le but de la manoeuvre c'est justement que le "Factory.GetObject()" n'aie pas besoin de connaître chaque type hérité.
Marsh Posté le 16-11-2007 à 16:38:34
Deja une vrai ref : http://en.wikipedia.org/wiki/Abstract_factory_pattern
Ensuite, l'idée, c'ets d'utilisez une table associative qui enregistre l'ID de l'objet creable + la fonction qui le crée. Ensuite, le dev a juste à creer cette fonction + enregistrer le couple (ID, Func) dans l a table.
La factory ensuite parcours la table pr savoir que faire.
Marsh Posté le 16-11-2007 à 16:55:55
Ouais donc c'est bien ça.
Sauf que là où ce serait vraiment intéressant, c'est si cette table pouvait d'auto-alimenter
Ca permettrait d'intégrer des modules tiers dans une application sans donner la main au tiers sur le code de l'appli de base, et sans pour autant le bloquer dans ces tests : il crée sa classe dans le même assembly que l'appli originale, hérite d'une classe de l'appli originale, et à partir de là, l'appli originale sera capable d'aller jouer avec son code.
Me semble que ça peut avoir pas mal d'intérêt non ?
Marsh Posté le 16-11-2007 à 17:03:54
bah tu mets un appel à une methode de classe dasn le constructeur de ta classe client qui appelle la fonction d'insertion solutino classique
Marsh Posté le 16-11-2007 à 17:14:21
J'veux bien qu'on soit sur la cat' PHP, mais quel emêlage de pinceaux!
@Joel: au fait, pq abstract factory plutôt que factory?
Citation : Abstract Factory Pattern provides a way to encapsulate a group of individual factories |
Alors que avec Factory :
Code :
|
Ca semble suffire, non?
Marsh Posté le 16-11-2007 à 21:08:50
Bon, pour info, hein, j'ai opté pour la solution d'omega 2, une fonction toute conne qui retourne un bel objet adequat.
Mais je pense que je vais changer ça et mettre cette fonction en méthode statique de la classe mère.
J'ai bon ou bien ou pas ?
Marsh Posté le 16-11-2007 à 22:01:27
Fais pêter le code.
Marsh Posté le 16-11-2007 à 23:42:26
tu l'auras voulu
Code :
|
Ca va c'est pas trop moche ? Niveau conventions de nommage et commentaires je suis conscient qu'il y a mieux à faire
Faut que je dise à quoi ça sert ?
Marsh Posté le 17-11-2007 à 01:03:20
MagicBuzz a écrit : Ouais donc c'est bien ça. |
Registry Pattern
Marsh Posté le 17-11-2007 à 09:12:56
ReplyMarsh Posté le 17-11-2007 à 11:29:34
sircam a écrit : J'veux bien qu'on soit sur la cat' PHP, mais quel emêlage de pinceaux! |
Arf, désolé pour le offtopic et mes questions C#.
Mais si je ne m'abuse, le topic a changé de cat non ? Je croyais l'avoir vu dans "divers" ou "algo" hier ()
Marsh Posté le 17-11-2007 à 11:59:36
Kangol, t'as pas un lien ou autre qui explique ce que c'est et comment ça marche ?
Parceque dans Wiki, je fais choux blanc, et dans Google, tout ce que je trouve c'est ça :
http://www.microsoft.com/germany/m [...] n_de_23151
C'est sympa, mais bon, j'aurais préféré un article plutôt qu'une vidéo en allemand
-- Grmpf, pis j'avais pas vu la vidéo en entier arf. Vais pas aller loin avec ce truc ! Il explique un peu pas grand chose, pis surtout ça montre pas trop ce que je veux faire lol
Moi ce que je cherche, c'est, si c'est possible, quoi mettre à la place des commentaires, sans pour autant faire un appel explicite aux classes dérivées.
Code :
|
Marsh Posté le 17-11-2007 à 13:46:32
Rien pigé à ton lien
Mais j'ai trouvé un moyen de faire marcher le Schmilblik...
Y'a certainement plus propre...
Program.cs
Code :
|
ITextConverter.cs
Code :
|
GenericTextConverter.cs
Code :
|
InheritedTextConverters.cs
Code :
|
Sortie :
|
Reste à le modifier pour que ça marche aussi avec des DLL chargées dynamiquement... Mais là ça m'a l'air d'être une bonne piste !
Marsh Posté le 17-11-2007 à 14:12:56
Ca marche !
Code :
|
Il suffit de publier des DLL dans le sous-répertoire "Converter".
Je n'ai besoin de distribuer pour des auteurs tiers qu'une version compilée (en DLL) des fichiers GenericTextConverter.cs et ITextConverter.cs
Marsh Posté le 17-11-2007 à 17:25:55
C'est pas que ça m'intéresse pas, mais ça mériterais ptet un tomic séparé, nan ?
genre un topic unique "design patterns", un truc comme ça
Marsh Posté le 17-11-2007 à 19:02:01
Un topic unique "Magicbuzz" alors ?
Marsh Posté le 16-11-2007 à 14:55:59
Yo.
J'ai un problème PHP/POO :
Voila je voudrais qu'un classe mère s'auto-transforme en une classe enfant, en fonction des paramètres donnés au constructeur, par ex.
genre j'ai :
Je ferais "$truc = new Instrument('Batterie')"; et le constructeur transformerais sa propre classe en "Percussion" (après recherche dans une BDD, par ex).
Bon l'exemple est super sommaire mais en gros c'est ça.
Ca se fait ?
Message édité par theredled le 16-11-2007 à 15:04:30
---------------
Contes de fées en yaourt --- █ --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique