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

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

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 :  

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
Reply

Marsh Posté le 16-11-2007 à 14:55:59   

Reply

Marsh Posté le 16-11-2007 à 15:10:05    

Avec un wrapper ?

Reply

Marsh Posté le 16-11-2007 à 15:21:48    

Design Pattern :: Factory


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

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


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

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


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

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

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

Marsh Posté le 16-11-2007 à 15:31:05    

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
Reply

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 :

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

Reply

Marsh Posté le 16-11-2007 à 15:45:41    

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
Reply

Marsh Posté le 16-11-2007 à 15:45:41   

Reply

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 :

  • 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
Reply

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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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.

Reply

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

Marsh Posté le 16-11-2007 à 16:19:40    

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

Reply

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


Message édité par MagicBuzz le 16-11-2007 à 16:28:26
Reply

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.

Reply

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 ?

Reply

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

Reply

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! :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}
Reply

Marsh Posté le 16-11-2007 à 19:36:33    

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

Reply

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 ?


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 16-11-2007 à 22:01:27    

Fais pêter le code.


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

Marsh Posté le 16-11-2007 à 23:42:26    

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
Reply

Marsh Posté le 17-11-2007 à 01:00:29    

Reply

Marsh Posté le 17-11-2007 à 01:03:20    

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

Reply

Marsh Posté le 17-11-2007 à 09:12:56    

KangOl a écrit :


Registry Pattern


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

Reply

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

Reply

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

Marsh Posté le 17-11-2007 à 12:47:51    

Reply

Marsh Posté le 17-11-2007 à 13:46:32    

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
Reply

Marsh Posté le 17-11-2007 à 14:12:56    

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:

Reply

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 ? :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
Reply

Marsh Posté le 17-11-2007 à 18:02:17    

y a en deja un :o

Reply

Marsh Posté le 17-11-2007 à 19:02:01    

Un topic unique "Magicbuzz" alors ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 18-11-2007 à 00:47:19    

c'est bas ^^ [:dawa]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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