Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide Recherche
1853 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Héritage de Template (généric)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] Héritage de Template (généric)

n°1937922
toonj
Posté le 05-11-2009 à 10:53:27  profilanswer
 

Bonjour,  
 
Je voudrais savoir comment faire pour crée une classe générique (Template) qui hérite du type passé en paramètre de template :
 
typiquement :
 

Code :
  1. class maClasse<T> : T
  2. {
  3.   //nouvelles propriétés
  4. }


 
Afin d'ajouter de nouvelles propriété à un objet existant
 
Remarque : La version  

Code :
  1. class maClasse<T>
  2. {
  3.   T _object;
  4.   //nouvelles propriétés
  5. }


ne m'intéresse pas trop car les propriétés de _object ne sont pas accessible directement...
 
Merci d'avance
 
Toonj


Message édité par toonj le 05-11-2009 à 10:54:30
mood
Publicité
Posté le 05-11-2009 à 10:53:27  profilanswer
 

n°1937983
Fred82
Posté le 05-11-2009 à 13:47:43  profilanswer
 

Ça n'a pas l'air possible, une classe doit hériter d'un type connu. Il y a un moment où tu ne pourras pas faire de généricité, et tu devras déclarer tes classes à un moment ou un autre ! N'oublie pas aussi que tu peux passer par des interfaces (ou même héritage tout bête de classe), ce qui solutionnera peut-être ton problème.
 
Exemple :

Code :
  1. public interface IToto
  2.    {
  3.        string propriete1 { get; set; }
  4.        int propriete2 { get; set; }
  5.    }
  6.  
  7.    public class Toto : IToto
  8.    {
  9.        string propriete1 { get; set; }
  10.        int propriete2 { get; set; }
  11.    }
  12.  
  13.    public class Toto2 : IToto
  14.    {
  15.        string propriete1 { get; set; }
  16.        int propriete2 { get; set; }
  17.    }


---------------
Vos smileys favoris sur HFR : Script Greasemonkey / Topic HFR officiel
n°1938008
toonj
Posté le 05-11-2009 à 14:42:43  profilanswer
 

En effet, après réflexion, cela n'a pas l'air possible, notamment dans le cas ou T est une interface (implémentation de maClasse incomplète...)
 
 
Sinon, dans le cas  

Code :
  1. class maClasse<T>
  2.    {
  3.       T _object;
  4.       //nouvelles propriétés
  5.    }


 
Existe-t-il un moyen de rendre accessible toutes les propriétés de _object au niveau de maClasse, sans avoir à les redéfinir manuellement ?

Code :
  1. public val { get { return _object.val;}
  2.                       set { _object.val = value;}}


Si _object contient une propriété val évidement
 
Merci
 
Toonj
 
PS : je rappelle le but : "encapsuler" une classe existante pour lui ajouter des propriétés, sachant que la classe existante peut être d'un grand nombre de type différent  et que les nouvelles propriétés, elles sont fixées

n°1938015
Fred82
Posté le 05-11-2009 à 15:02:07  profilanswer
 

Non, ce n'est pas possible, mais tu peux faire beaucoup mieux, si j'ai bien compris ton problème.

 

Tu sais que le code que tu as mis ci-dessus n'est possible que si tu déclares ça :
=>

Code :
  1. class maClasse<T> where T : IToto
  2.  
  3. et
  4.  
  5. public interface IToto
  6. {
  7. int val {get;set;}
  8. }
 

Il faut explicitement donner une interface (ou une classe à hériter) pour pouvoir faire _object.val. Sinon val n'est pas connu.

 

Par conséquent ton problème peut se résoudre autrement. Tu hérites maClasse de ton interface (ou une classe ! ce qui est plus pratique) et tu rajoutes tes nouvelles propriétés dans maClasse.

 

La généricité me semble inutile pour ton problème.

 

Edit : ah si, je vois ce que tu veux dire...


Message édité par Fred82 le 05-11-2009 à 15:08:15

---------------
Vos smileys favoris sur HFR : Script Greasemonkey / Topic HFR officiel
n°1938027
Fred82
Posté le 05-11-2009 à 15:16:59  profilanswer
 

Bon ok je crois avoir mieux compris grâce au PS :
"PS : je rappelle le but : "encapsuler" une classe existante pour lui ajouter des propriétés, sachant que la classe existante peut être d'un grand nombre de type différent  et que les nouvelles propriétés, elles sont fixées "
 
Alors le problème, comme expliqué au message précédent, c'est que tu seras alors obligé de déclarer des interfaces pour chacune de tes classes existantes, et il sera impossible de faire une seule classe générique qui implémente toutes les interfaces à la fois (car les classes existantes n'implémentent pas toutes toutes les interfaces à la fois). Donc tu vas être obligé de créer une classe d'extension par classe existante, et donc finalement pas de généricité.
 
Ce que je te conseille :
- une classe d'extension par classe existante
- une interface qui va définir les propriétés d'extensions
et chaque classe d'extension implémente à la fois l'interface et la classe existante correspondante.
 
Il n'y a pas vraiment le choix je crois.


---------------
Vos smileys favoris sur HFR : Script Greasemonkey / Topic HFR officiel
n°1938030
toonj
Posté le 05-11-2009 à 15:31:36  profilanswer
 

Peut être aurais je du exposer mon problème plus clairement des le début :
 
J'ai une série de classes dont je veux afficher les propriétés via un gridview
 

Code :
  1. class A
  2. {
  3.   int _intA;
  4.   public  int IntA {get {return _intA;}}
  5.   bool _boolA;
  6.   public bool BoolA {get {return _boolA;}} 
  7. }
  8. class B
  9. {
  10.   float _floatB;
  11.   public  float FloatB {get {return _floatB;}}
  12.   string _stringA;
  13.   public  StringA{get {return _stringA;}} 
  14. }
  15. ...


Pour toute ces classes, je voudrais ajouter des propriétés

Code :
  1. public  string Propriété1{get ...}
  2. public  string Propriété2{get ...}


 
pour avoir au final des classes  

Code :
  1. class A_evoluee
  2. {
  3.   int _intA;
  4.   public  int IntA {get {return _intA;}}
  5.   bool _boolA;
  6.   public bool BoolA {get {return _boolA;}} 
  7.   public  string Propriété1{get ...}
  8.   public  string Propriété2{get ...}
  9. }
  10. class B_evoluee
  11. {
  12.   float _floatB;
  13.   public  float FloatB {get {return _floatB;}}
  14.   string _stringA;
  15.   public  StringA{get {return _stringA;}} 
  16.   public  string Propriété1{get ...}
  17.   public  string Propriété2{get ...}
  18. }
  19. ...


 
Comme l'héritage multiple n'existe pas
Soit je définit une interface évoluée et je fais hériter mes classes évoluées de cette interface

Code :
  1. public interface IEvoluee
  2. {
  3.   string Propriété1{get ...}
  4.   string Propriété2{get ...}
  5. }
  6. class A_evoluee : A, IEvoluee
  7. {
  8.   string _propriété1;
  9.   public  string Propriété1{get {return _propriété1;}}
  10.   string _propriété2;
  11.   public  string Propriété2{get {return _propriété2;}}
  12. }
  13. ...


 
Mais il faut que je le fasse pour chaque classe (impensable)
 
Soit (solution de repli) j'encapsule ma classe de Base dans une classe template

Code :
  1. class Evoluee<T>
  2. {
  3.   public Evoluee(T source) : {object = sources;}
  4.   T _object;
  5.   string _propriété1;
  6.   public  string Propriété1{get {return _propriété1;}}
  7.   string _propriété2;
  8.   public  string Propriété2{get {return _propriété2;}}
  9. }
  10. using A_evoluee = Evoluee<A>;
  11. using B_evoluee = Evoluee<B>;


Mais dans ce cas là les propriétés de ma classe de base (mon _object) ne sont plus accessibles et ne s'afficheront pas automatiquement...
 
Des idées ?
 
Toonj

n°1938038
Fred82
Posté le 05-11-2009 à 15:50:51  profilanswer
 

ah oui je vois, l'idée du GridView...
 
Et peux-tu modifier les classes de base ? Du genre qu'elles héritent de la classe qui contiennent les propriété supplémentaires (héritage dans l'autre sens donc) ?


---------------
Vos smileys favoris sur HFR : Script Greasemonkey / Topic HFR officiel
n°1938049
toonj
Posté le 05-11-2009 à 16:42:59  profilanswer
 

non, bien sur, ca serait trop simple ! (en plus, elles héritent déjà d'autres classes...)

n°1938078
Fred82
Posté le 05-11-2009 à 17:11:56  profilanswer
 

Ouais tant qu'à faire :D

 

J'ai trouvé ça qui pourrait t'être utile :
http://www.codeproject.com/cs/misc [...] operty.asp

 

J'ai vaguement regardé, l'idée serait d'ajouter dynamiquement en code des nouvelles propriétés à des classes existantes, ce qui pourrait t'arranger ! Ca passe par la reflection hélas (ce qui ralentit beaucoup les perfs...).

 

Je ne vois pas d'autre solution...


Message édité par Fred82 le 05-11-2009 à 17:12:41

---------------
Vos smileys favoris sur HFR : Script Greasemonkey / Topic HFR officiel
n°1938094
toonj
Posté le 05-11-2009 à 18:04:44  profilanswer
 

:whistle: Le lien ne fonctionne pas chez moi...
 
On vient de me dire qu'il ne faut pas afficher toutes les propriétés ! :smiley_du_gars_qui_se_tire_une_balle:
 
Donc en fait, pour chaque propriété à afficher, je vais faire des Template column et appeler directement la propriété voulue
_object.IntA...
et ce, pour chaque type de classe !  :smiley_du_gars_qui_se_tire_une_balle_encore une fois:
 
En tout cas, merci quand même...

n°1938228
Fred82
Posté le 06-11-2009 à 09:41:50  profilanswer
 

codeproject.com avait des problèmes hier, là ça a l'air d'aller mieux.

 

Ah d'accord, tu vas donc avoir beaucoup de travail en plus, n'est-ce pas...

 

D'ailleurs là, tu pourrais faire un GridView qui se construit dynamiquement à partir de l'objet source, en sélectionnant les colonnes à afficher via les "attributs" et la "reflection". Cela nécessiterait de retravailler les classes source en leur rajoutant un attribut à chaque propriété à afficher, pour ensuite construire chaque colonne du GridView via la reflection. A voir...


Message édité par Fred82 le 01-07-2011 à 12:06:36

---------------
Vos smileys favoris sur HFR : Script Greasemonkey / Topic HFR officiel
n°1938534
TotalRecal​l
homo sapiens computus
Posté le 06-11-2009 à 21:31:39  profilanswer
 

Juste pour info, si j'ai bien compris le post initial ce que tu souhaites porte un nom : http://en.wikipedia.org/wiki/Curio [...] te_pattern
Et je pense que ce n'est pas possible (en tout cas pas aussi directement) en C#. Tu peux essayer de demander à google "CRTP c#" pour voir ce qu'il en est...


Message édité par TotalRecall le 06-11-2009 à 21:32:23

---------------
Kits amplis classe D / T      Topic .Net - C# @ Prog
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Héritage de Template (généric)

 

Sujets relatifs
programmation wifi linux en CNotation romaine décroissante en langage C
[Résolu] Généricité et héritage[C#] HttpWebRequest + accent
Interop C# - Java via Com4jInterop C# - Java via Com4j
Appel d'url via un programme en C++syntaxe : typedef typename F::template
[C#] Delegate générique[C#] Classes génériques, réflexion
Plus de sujets relatifs à : [C#] Héritage de Template (généric)


Hit-Parade
Copyright © 1997-2012 Hardware.fr SARL / Groupe LDLC / LesNumeriques.com / Version anglaise du site: BeHardware