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

Héritage de Template (généric) [C#] - C#/.NET managed - Programmation

Marsh Posté le 05-11-2009 à 10:53:27    

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
Reply

Marsh Posté le 05-11-2009 à 10:53:27   

Reply

Marsh Posté le 05-11-2009 à 14:42:43    

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

Reply

Marsh Posté le 05-11-2009 à 15:31:36    

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

Reply

Marsh Posté le 05-11-2009 à 16:42:59    

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

Reply

Marsh Posté le 05-11-2009 à 18:04:44    

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

Reply

Marsh Posté le 06-11-2009 à 21:31:39    

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

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Sujets relatifs:

Leave a Replay

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