Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1021 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°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°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°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°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°1938534
TotalRecal​l
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

---------------
Topic .Net - C# @ Prog

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)


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