Interfaces et propriétés : les limites

Interfaces et propriétés : les limites - C#/.NET managed - Programmation

Marsh Posté le 02-06-2006 à 13:22:26    

Bon... les interfaces m'énervent.
J'ai une interface ITruc qui définie une propriété 'Info' qui retourne une donnée.
J'ai un objet Truc qui l'implémente
Je veux la dériver en :
- TrucFixe qui implémente bètement Truc
- TrucEditable qui enrichie l'interface en autorisant l'accesseur 'set' sur la propriété.
=> Ca compile pas : on n'a pas le droit de faire un override sur une propriété en rajoutant un accesseur
 
Si je fait un 'new' sur la propriété, je perds le polymorphisme : quand je cast mon TrucEditable en Truc et que je récupère la valeur de Info, c'est Truc.Info qui est appelé et pas TrucEditable.Info.
 
RHAAAAAAAAAAAA c'est agaçant :p
 

Code :
  1. public interface ITruc
  2. {
  3. object Info {get;}
  4. }
  5. public class Truc
  6. {
  7. public object Info
  8. {
  9.  get{null;}
  10. }
  11. }
  12. public class TrucFixe : Truc
  13. {
  14. private object ComputeInfo() {...}
  15. public object Info
  16. {
  17.  get{return this.ComputeInfo();}
  18. }
  19. }
  20. public class TrucEditable : Truc
  21. {
  22. private object _info;
  23. public new object Info
  24. {
  25.  get{return this._info;}
  26.  set{this._info = value;}
  27. }
  28. }

Reply

Marsh Posté le 02-06-2006 à 13:22:26   

Reply

Marsh Posté le 02-06-2006 à 13:31:39    

Bonjour,
 
En effet cest une particularité si tu veux redefinir un setter et un getter, il faut que dans la classe mére tu definisses aussi le getter et setter !
 
Donc tu mets Un set à rien  !!!
 

Code :
  1. public interface ITruc
  2. {
  3. object Info {get;}
  4. }
  5. public class Truc
  6. {
  7. public object Info
  8. {
  9.  get{null;}
  10.                           set{}
  11. }
  12. }
  13. public class TrucFixe : Truc
  14. {
  15. private object ComputeInfo() {...}
  16. public object Info
  17. {
  18.  get{return this.ComputeInfo();}
  19.                           set{}
  20. }
  21. }
  22. public class TrucEditable : Truc
  23. {
  24. private object _info;
  25. public new object Info
  26. {
  27.  get{return this._info;}
  28.  set{this._info = value;}
  29. }
  30. }


 
Edit: Je ne sais pas si c'est une erreur de past n copy mais ta classe truc n'implemente pas ITruc car il n'ya pas Tru : ITruc


Message édité par toastbeman le 02-06-2006 à 13:43:58
Reply

Marsh Posté le 02-06-2006 à 16:09:36    

ouaip, t'as raison, c une erreur de copie/paste.
Le set vide ça m'ennuyais beaucoup dans l'esprit, alors j'ai trouvé une autre solution :
 
* le champ est dans la classe de base.
* y'a une méthode 'ComputeInfo' qui est appelé s'il n'a jamais été initialisé, dans le cas où le champs est calculé.
* c'est optimisé dans mon cas, car l'info n'est jamais nulle pour un TrucEditable.
En gros c'est du pseudo-polymorphisme, pour le codeur c'est complètement transparent.
 

Code :
  1. public interface ITruc
  2. {
  3. object Info {get;}
  4. }
  5. public abstract class Truc : ITruc
  6. {
  7. private object _info = null;
  8. public object Info
  9. {
  10.  get
  11.  {
  12.   if(this._info == null)
  13.    this._info = this.ComputeInfo();
  14.   return this._info;
  15.  }
  16. }
  17. protected void SetInfo(object info)
  18. {
  19.  this._info = info;
  20. }
  21. protected abstract object ComputeInfo();
  22. }
  23. public class TrucFixe : Truc
  24. {
  25. protected override object ComputeInfo()
  26. {
  27.  //...
  28. }
  29. }
  30. public class TrucEditable : Truc
  31. {
  32. public TrucEditable(object info)
  33. {
  34.  this.SetInfo(info);
  35. }
  36. public new object Info
  37. {
  38.  get{return base.Info;}
  39.  set{this.SetInfo(value);}
  40. }
  41. protected override object ComputeInfo()
  42. {
  43.  // nada. jamais appelé
  44. }
  45. }


 

Reply

Sujets relatifs:

Leave a Replay

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