Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
735 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [POO] Auto-héritage, c'est possible ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[POO] Auto-héritage, c'est possible ?

n°1644016
theredled
● REC
Posté le 16-11-2007 à 14:55:59  profilanswer
 

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 :  

Code :
  1. class Instrument {
  2.  abstract function jouerUnTruc();
  3. }
  4. class Percussion extends Instrument {
  5.  function jouerUnTruc() {
  6.    faireTocToc();
  7.  }
  8. }
  9. class Cuivre extends Instrument {
  10.  function jouerUnTruc() {
  11.    fairePouetPouet();
  12.  }
  13. }


 
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
mood
Publicité
Posté le 16-11-2007 à 14:55:59  profilanswer
 

n°1644021
Elmoricq
Modérateur
Posté le 16-11-2007 à 15:10:05  profilanswer
 

Avec un wrapper ?

n°1644025
sircam
I Like Trains
Posté le 16-11-2007 à 15:21:48  profilanswer
 

Design Pattern :: Factory


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1644026
theredled
● REC
Posté le 16-11-2007 à 15:21:50  profilanswer
 

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 :o


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1644028
theredled
● REC
Posté le 16-11-2007 à 15:23:05  profilanswer
 

sircam a écrit :

Design Pattern :: Factory


Ah, avec ça j'ai déja plus de résultats de recherche :o


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1644030
masklinn
í dag viðrar vel til loftárása
Posté le 16-11-2007 à 15:25:10  profilanswer
 

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 :o)

Message cité 1 fois
Message édité par masklinn le 16-11-2007 à 15:26:06

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1644031
theredled
● REC
Posté le 16-11-2007 à 15:26:57  profilanswer
 

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 :o)


Sauf quand méthode abstraites toussa, sauf qu'on ne peut pas instancier une classe abstraite si je ne m'abuse :D


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1644033
masklinn
í dag viðrar vel til loftárása
Posté le 16-11-2007 à 15:31:05  profilanswer
 

theredled a écrit :

Sauf quand méthode abstraites toussa


Whut? [:mlc]
 
Non, même là [:mlc]

theredled a écrit :

sauf qu'on ne peut pas instancier une classe abstraite si je ne m'abuse :D

Quel est le rapport avec la choucroutte?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1644047
omega2
Posté le 16-11-2007 à 15:43:40  profilanswer
 

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 :

  • le faire de manière statique genre  
Code :
  1. if ($typeobj=='percussion') then
  2.     $obj = new Percussion()
  3.   else ...


  • de manière dynamique genre  
Code :
  1. $obj = new $typeobj();


 
Evidement, il faut vérifier l'existence de la classe demandé et filtrer pour ne pas créer n'importe quoi comme objet.

n°1644049
theredled
● REC
Posté le 16-11-2007 à 15:45:41  profilanswer
 

masklinn a écrit :


Whut? [:mlc]
 
Non, même là [:mlc]

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.


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
mood
Publicité
Posté le 16-11-2007 à 15:45:41  profilanswer
 

n°1644054
theredled
● REC
Posté le 16-11-2007 à 15:48:54  profilanswer
 

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 :

  • le faire de manière statique genre  
Code :
  1. if ($typeobj=='percussion') then
  2.     $obj = new Percussion()
  3.   else ...


  • de manière dynamique genre  
Code :
  1. $obj = new $typeobj();


 
Evidement, il faut vérifier l'existence de la classe demandé et filtrer pour ne pas créer n'importe quoi comme objet.


Et du coup dans le constructeur je fais un "return $obj" ?


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1644059
masklinn
í dag viðrar vel til loftárása
Posté le 16-11-2007 à 15:54:46  profilanswer
 

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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1644061
omega2
Posté le 16-11-2007 à 15:57:38  profilanswer
 

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.

n°1644068
MagicBuzz
Posté le 16-11-2007 à 16:04:17  profilanswer
 

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 :
  1. foreach (InstrumentClass myClass in InheritedClassesFromInstrument)
  2. {
  3.    if (myClass.IsFamilyOf(MonInstrument))
  4.       return (Instrument)new MyClass(MonInstrument);
  5. }
  6. throw new Exception("Instrument non pris en charge !" );


 
Ou un trucdu genre ? [:magicbuzz]
 
Parceque du coup on pourrait faire, sans connaitre à l'avance les types hérités :

Code :
  1. try
  2. {
  3.  Instrument maFlute = Instrument.CreateInstrument("flûte" );
  4.  maFlute.JouerNote(Intrument.Notes.Fa);
  5. }
  6. catch
  7. {
  8.  Console.WriteLine("Proutch" );
  9. }


Message édité par MagicBuzz le 16-11-2007 à 16:06:38
n°1644080
Joel F
Real men use unique_ptr
Posté le 16-11-2007 à 16:19:40  profilanswer
 

Vous reinventez tous la roue là :o
Y a pas a chier des perles. Pattern Factory et fisa :o

n°1644089
MagicBuzz
Posté le 16-11-2007 à 16:24:56  profilanswer
 

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é.


Message édité par MagicBuzz le 16-11-2007 à 16:28:26
n°1644100
Joel F
Real men use unique_ptr
Posté le 16-11-2007 à 16:38:34  profilanswer
 

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.

n°1644117
MagicBuzz
Posté le 16-11-2007 à 16:55:55  profilanswer
 

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 ?

n°1644128
Joel F
Real men use unique_ptr
Posté le 16-11-2007 à 17:03:54  profilanswer
 

bah tu mets un appel à une methode de classe dasn le constructeur de ta classe client qui appelle la fonction d'insertion :o solutino classique :o

n°1644143
sircam
I Like Trains
Posté le 16-11-2007 à 17:14:21  profilanswer
 

J'veux bien qu'on soit sur la cat' PHP, mais quel emêlage de pinceaux! :o
 
@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 :
  1. public class ImageReaderFactory
  2. {
  3.     public static ImageReader getImageReader( InputStream is )
  4.     {
  5.         int imageType = figureOutImageType( is );
  6.         switch( imageType )
  7.         {
  8.             case ImageReaderFactory.GIF:
  9.                 return new GifReader( is );
  10.             case ImageReaderFactory.JPEG:
  11.                 return new JpegReader( is );
  12.             // etc.
  13.         }
  14.     }
  15. }


Ca semble suffire, non?
 


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1644227
Joel F
Real men use unique_ptr
Posté le 16-11-2007 à 19:36:33  profilanswer
 

je m'a trompé de lien dans WK :^p
 
ofc Factory ca suffit

n°1644254
theredled
● REC
Posté le 16-11-2007 à 21:08:50  profilanswer
 

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 ?


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1644264
sircam
I Like Trains
Posté le 16-11-2007 à 22:01:27  profilanswer
 

Fais pêter le code.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1644289
theredled
● REC
Posté le 16-11-2007 à 23:42:26  profilanswer
 

tu l'auras voulu :o

Code :
  1. <?php
  2.     
  3. function getObjXmlFournisseur($path) {
  4.     if (!($docXML = new SimpleXMLElement($path, 0, true)))
  5.         return false;
  6.     $res = preg_match('#^(.*)/sites/delivery/(alexlee|finetunes)(.*)$#', $path, $tab);
  7.     if (!$res)
  8.         return false;
  9.     
  10.     $fourn = $tab[2];
  11.     
  12.     if ($fourn=='alexlee')
  13.         $obj = new clXmlAlexlee($path, $docXML);
  14.     elseif ($fourn=='finetunes')
  15.         $obj = new clXmlFinetunes($path, $docXML);
  16.     else
  17.         return false;
  18.         
  19.     return $obj;
  20. }
  21.  
  22. abstract class clXmlFournisseurMother {
  23.         var $pathXML;
  24.         var $docXML;
  25.         var $fourn;
  26.         var $rootPath;
  27.         
  28.         abstract protected function _getPathInDel($pathDeQuoi, $id);
  29.         
  30.         function getPathInDel($pathDeQuoi, $id) {
  31.             if (is_file($path = $this->_getPathInDel($pathDeQuoi, $id))
  32.                     and ($res = preg_match('#^(.*)/sites/delivery/(.*)$#', $path, $tab)))
  33.             {
  34.                 return $tab[2];
  35.             }
  36.             return false;
  37.         }
  38. }
  39.  
  40. class clXmlAlexlee extends clXmlFournisseurMother {
  41.         function clXmlAlexlee($path, $docXML) {
  42.             $res = preg_match('#^(.*/sites/delivery/alexlee)/(.*)$#', $path, $tab);
  43.             $this->rootPath = $tab[1];
  44.             $this->docXML = $docXML;
  45.             $this->delPath = realpath(dirname($path).'/../..');
  46.         }
  47.         
  48.         protected function _getPathInDel($pathDeQuoi, $id) {
  49.             if (in_array($pathDeQuoi, array('mp3', 'wav', 'ext'))
  50.                     and ($tab = $this->docXML->xpath("//track[isrc='".$id."']/track_key" )))
  51.             {
  52.                 if ($pathDeQuoi=='mp3' and $dirAudio = $this->getDir('audio'))
  53.                     return $dirAudio.'/'.$tab[0].'.mp3';
  54.                 elseif ($pathDeQuoi=='wav' and $dirAudio = $this->getDir('audio'))
  55.                     return $dirAudio.'/'.$tab[0].'.wav';
  56.                 elseif ($pathDeQuoi=='ext'  and $dirClips = $this->getDir('clips'))
  57.                     return $dirClips.'/'.makeClipFileName($tab[0]);
  58.             }
  59.             return false;
  60.         }
  61.  
  62.         function getDir($type) {
  63.             $dir = '';
  64.             switch ($type) {
  65.                 case 'deliv' : $dir = $this->delPath; break;
  66.                 case 'pochettes' : $dir = $this->delPath.'/graphics'; break;
  67.                 case 'audio' : $dir = $this->delPath.'/audio'; break;
  68.                 case 'clips' :
  69.                         $dir = $this->delPath.'/audio/clips';
  70.                         if (!is_dir($dir))
  71.                             $dir = $this->delPath.'/clips';
  72.                         break;
  73.             }
  74.             return ($dir and is_dir($dir)) ? $dir : false;
  75.         }
  76.         
  77.         function makeClipFileName($trackKey) {
  78.             preg_match_all("|^([^_]*)_([^_]*)_(.*)$|", $trackKey, $out, PREG_SET_ORDER);
  79.             if (!$out) {
  80.                 return false;
  81.             }
  82.             return $out[0][1].'_'.$out[0][2].'_clip_'.$out[0][3].'.mp3';
  83.         }
  84. }
  85.  
  86. class clXmlFinetunes extends clXmlFournisseurMother {
  87.         function clXmlFinetunes($path, $docXML) {
  88.             $res = preg_match('#^(.*/sites/delivery/finetunes/finetunes)/(.*)$#', $path, $tab);
  89.             $this->rootPath = $tab[1];
  90.             $this->docXML = $docXML;
  91.             $this->delPath = realpath(dirname($path).'/..');
  92.         }
  93.  
  94.         protected function _getPathInDel($pathDeQuoi, $id) {
  95.             if (in_array($pathDeQuoi, array('mp3', 'wav', 'ext'))) {
  96.                 if ($pathDeQuoi=='wav' or $pathDeQuoi=='mp3')
  97.                     $xpath = "//track[id[@type='isrc']='$id']/resource[@type='audiofile' and datatype='audio/$pathDeQuoi']/uri";
  98.                 elseif ($pathDeQuoi=='ext')
  99.                     $xpath = "//track[id[@type='isrc']='$id']/resource[@type='prelistening' and quality[@type='bitrate']='64']/uri";
  100.                         
  101.                 $tab = $this->docXML->xpath($xpath);
  102.                 return $this->rootPath.'/'.$tab[0];
  103.                 
  104.                 if (!$tab[0])
  105.                     return false;
  106.             }
  107.         }
  108. }


Ca va c'est pas trop moche ? :/ Niveau conventions de nommage et commentaires je suis conscient qu'il y a mieux à faire [:petrus75]
Faut que je dise à quoi ça sert ? :D


Message édité par theredled le 16-11-2007 à 23:53:36

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1644309
KangOl
Profil : pointeur
Posté le 17-11-2007 à 01:00:29  profilanswer
 
n°1644310
KangOl
Profil : pointeur
Posté le 17-11-2007 à 01:03:20  profilanswer
 

MagicBuzz a écrit :

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 ?


Registry Pattern

n°1644332
Joel F
Real men use unique_ptr
Posté le 17-11-2007 à 09:12:56  profilanswer
 

KangOl a écrit :


Registry Pattern


Merci, je me rappelelr plus son petit nom à lui  :sol:

n°1644357
MagicBuzz
Posté le 17-11-2007 à 11:29:34  profilanswer
 

sircam a écrit :

J'veux bien qu'on soit sur la cat' PHP, mais quel emêlage de pinceaux! :o


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 (:??:)

n°1644368
MagicBuzz
Posté le 17-11-2007 à 11:59:36  profilanswer
 

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 :D
 
-- 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 :
  1. public abstract class GenericTextConverter
  2. {
  3.     public static ITextConverter GetTextConverter(string TextToConvert)
  4.     {
  5.         // Appelle le "CanConvert" de chaque classe héritée
  6.         // Et retourne une instance de la première qui répond true
  7.         // Le but de la manoeuvre, c'est que cette méthode n'aie pas besoin de
  8.         return (ITextConverter)new <LaClasseQuiVaBien>();
  9.     }
  10. }
  11.  
  12. public interface ITextConverter
  13. {
  14.     static bool CanConvert(string OriginalText);
  15.  
  16.     string Convert(string OriginalText);
  17.     string Revert(string ConvertedText);
  18. }
  19.  
  20. public class Converter1 : GenericTextConverter, ITextConverter
  21. {
  22.     static bool CanConvert(string OriginalText)
  23.     {
  24.         return (OriginalText.IndexOf('-') == 0)
  25.     }
  26.  
  27.  
  28.     string Convert(string OriginalText)
  29.     {
  30.         return "Convert1 : " + OriginalText.Replace(' ', '-');
  31.     }
  32.  
  33.     string Revert(string ConvertedText)
  34.     {
  35.         return "Revert1 : " + ConvertedText.Replace('-', ' ');
  36.     }
  37. }
  38.  
  39. public class Converter2 : GenericTextConverter, ITextConverter
  40. {
  41.     static bool CanConvert(string OriginalText)
  42.     {
  43.         return (OriginalText.IndexOf('#') == 0)
  44.     }
  45.  
  46.  
  47.     string Convert(string OriginalText)
  48.     {
  49.         return return "Convert2 : " + OriginalText.Replace('t', '#');
  50.     }
  51.  
  52.     string Revert(string ConvertedText)
  53.     {
  54.         return return "Convert2 : " + ConvertedText.Replace('#', 't');
  55.     }
  56. }


Message édité par MagicBuzz le 17-11-2007 à 12:48:53
n°1644396
KangOl
Profil : pointeur
Posté le 17-11-2007 à 12:47:51  profilanswer
 
n°1644421
MagicBuzz
Posté le 17-11-2007 à 13:46:32  profilanswer
 

Rien pigé à ton lien :D
 
Mais j'ai trouvé un moyen de faire marcher le Schmilblik...
Y'a certainement plus propre...
 
Program.cs

Code :
  1. using System;
  2.  
  3. namespace HeritageExtensible
  4. {
  5.    class Program
  6.    {
  7.        static void Main(string[] args)
  8.        {
  9.            string[] MesString = new string[]{"toto va à la plage", "pique-nique", "toto pique-nique à la plage"};
  10.  
  11.            foreach (string MaString in MesString)
  12.            {
  13.                ITextConverter MonConverter = GenericTextConverter.GetTextConverter(MaString);
  14.                if (MonConverter != null)
  15.                {
  16.                    Console.WriteLine(MonConverter.Convert(MaString));
  17.                }
  18.                else
  19.                {
  20.                    Console.WriteLine("Impossible de convertir " + MaString);
  21.                }
  22.            }
  23.  
  24.            Console.ReadKey(true);
  25.        }
  26.    }
  27. }


 
ITextConverter.cs

Code :
  1. using System;
  2.  
  3. namespace HeritageExtensible
  4. {
  5.    public interface ITextConverter
  6.    {
  7.        bool CanConvert(string OriginalText);
  8.  
  9.        string Convert(string OriginalText);
  10.    }
  11. }


 
GenericTextConverter.cs

Code :
  1. using System;
  2. using System.Reflection;
  3. namespace HeritageExtensible
  4. {
  5.    public abstract class GenericTextConverter
  6.    {
  7.        public static ITextConverter GetTextConverter(string TextToConvert)
  8.         {
  9.            Assembly MonAssembly = Assembly.GetExecutingAssembly();
  10.            Type[] MesTypes = MonAssembly.GetTypes();
  11.            foreach (Type MonType in MesTypes)
  12.            {
  13.                if (MonType.IsSubclassOf(Type.GetType("HeritageExtensible.GenericTextConverter" )))
  14.                {
  15.                    ITextConverter MonInstance = (ITextConverter)Activator.CreateInstance(MonType);
  16.                    if (MonInstance.CanConvert(TextToConvert))
  17.                    {
  18.                        return MonInstance;
  19.                    }
  20.                }
  21.            }
  22.            return null;
  23.         }
  24.    }
  25. }


 
InheritedTextConverters.cs

Code :
  1. using System;
  2.  
  3. namespace HeritageExtensible
  4. {
  5.    public class Converter1 : GenericTextConverter, ITextConverter
  6.    {
  7.        public bool CanConvert(string OriginalText)
  8.         {
  9.            return (OriginalText.IndexOf('-') == -1);
  10.         }
  11.  
  12.        public string Convert(string OriginalText)
  13.        {
  14.            return "Convert1 : " + OriginalText.Replace(' ', '-');
  15.        }
  16.    }
  17.  
  18.    public class Converter2 : GenericTextConverter, ITextConverter
  19.    {
  20.        public bool CanConvert(string OriginalText)
  21.         {
  22.            return (OriginalText.IndexOf(' ') == -1);
  23.         }
  24.  
  25.        public string Convert(string OriginalText)
  26.         {
  27.             return "Convert2 : " + OriginalText.Replace('-', ' ');
  28.         }
  29.    }
  30. }


 
Sortie :


Convert1 : toto-va-à-la-plage
Convert2 : pique nique
Impossible de convertir toto pique-nique à la plage


 
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 !


Message édité par MagicBuzz le 17-11-2007 à 13:47:53
n°1644426
MagicBuzz
Posté le 17-11-2007 à 14:12:56  profilanswer
 

Ca marche !
 

Code :
  1. public static ITextConverter GetTextConverter(string TextToConvert)
  2.         {
  3.            foreach (string Converter in Directory.GetFiles("./converters", "*.dll" ))
  4.            {
  5.                FileInfo MonFichier = new FileInfo(Converter);
  6.                Assembly MonAssembly = Assembly.LoadFile(MonFichier.FullName);
  7.                Type[] MesTypes = MonAssembly.GetTypes();
  8.  
  9.                foreach (Type MonType in MesTypes)
  10.                {
  11.                    if (MonType.IsSubclassOf(Type.GetType("HeritageExtensible.GenericTextConverter" )))
  12.                    {
  13.                        ITextConverter MonInstance = (ITextConverter)Activator.CreateInstance(MonType);
  14.                        if (MonInstance.CanConvert(TextToConvert))
  15.                        {
  16.                            return MonInstance;
  17.                        }
  18.                    }
  19.                }
  20.            }
  21.            return null;
  22.         }


 
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 :bounce:

n°1644514
theredled
● REC
Posté le 17-11-2007 à 17:25:55  profilanswer
 

C'est pas que ça m'intéresse pas, mais ça mériterais ptet un tomic séparé, nan ? :D
genre un topic unique "design patterns", un truc comme ça :o


Message édité par theredled le 17-11-2007 à 17:26:06

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1644522
Joel F
Real men use unique_ptr
Posté le 17-11-2007 à 18:02:17  profilanswer
 

y a en deja un :o

n°1644531
0x90
Posté le 17-11-2007 à 19:02:01  profilanswer
 

Un topic unique "Magicbuzz" alors ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1644582
Joel F
Real men use unique_ptr
Posté le 18-11-2007 à 00:47:19  profilanswer
 

c'est bas ^^ [:dawa]

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [POO] Auto-héritage, c'est possible ?

 

Sujets relatifs
Problème avec héritage et méthode virtuelleGénérer de faux visiteurs. Possible ?
Pblm héritage et méthode "sans" argument...[PHP ou HTML] redirection sur une URL à compléter en auto
[PHP][resolu] appel de fonction avec nom généré dynamiquementColonnes de même hauteur avec bordures : possible sans tableau ?
Est-il possible d'effectuer plusieurs UPDATE en une fois?Hauteur d'un div initialisé en auto
XSD : possible ou pas possible ?[Symfony] Récup dans une variable au lieu d'affichage, possible ?
Plus de sujets relatifs à : [POO] Auto-héritage, c'est possible ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR