Accès instances de classes...

Accès instances de classes... - C#/.NET managed - Programmation

Marsh Posté le 11-06-2010 à 11:07:05    

Bonjour,
 
Je suis en train de bosser sur une appli C# perso. Je n'ai pas des masses de connaissances en POO et j'ignore la plupart des design patterns. Je suis donc à la recherche d'une solution pour réaliser la chose suivante :
 
Soit une classe A qui, dans son constructeur, instancie une classe B et une classe X.
La classe B, dans son constructeur, instancie la classe C.
J'aimerais, dans le constructeur de C accéder à la classe X instanciée lors de l'instanciation de la classe A.
 

Code :
  1. public class A
  2. {
  3.      public B oB;
  4.      public X oX;
  5.      public A ()
  6.      {
  7.           oX = new X ();
  8.           oB = new B ();
  9.      }
  10. }
  11. public class B
  12. {
  13.      public C oC;
  14.    
  15.      public B ()
  16.      {
  17.           oC = new C ();
  18.      }
  19. }
  20. public class C
  21. {
  22.      public C ()
  23.      {
  24.      // Comment accéder à oX ?
  25.      }
  26. }


Pour l'instant, la seule solution que je vois, est de transmettre oX comme paramètre dans les différents constructeurs (l9 => "oB = new B (oX);", etc...) mais dans la réalité j'ai beaucoup plus d'étages que A/B/C donc ça m'embête un peu de trainer un paramètre pour ça.
 
Quelqu'un aurait-il une meilleure idée ? Merci d'avance pour vos réponses :jap:

Reply

Marsh Posté le 11-06-2010 à 11:07:05   

Reply

Marsh Posté le 11-06-2010 à 14:03:02    

Merci, j'y avais pensé mais mon problème c'est que j'ai plusieurs instances de la classe A donc comment retrouver le oX de la bonne instance ?
 

Code :
  1. A toto = new A ()
  2. A tata = new A ()
  3. toto.oX <> tata.oX


 
Donc déclarer en static ne fonctionne pas dans ce cas, n'est-ce pas ? Ou alors je n'ai pas compris un truc...

Reply

Marsh Posté le 11-06-2010 à 14:55:13    

D'accrod, cela ne m'étonnrait pas qu'il y ait un design pattern pour ce genre de cas mais, moi non plus, je n'ai pas beaucoup de connaissance de ce coté. Je vais essayer d'en éplucher quelques-uns, on ne sait jamais :p

Reply

Marsh Posté le 11-06-2010 à 17:28:15    

La transmettre à chaque instanciation n'est pas délirant, si le nombre de cascades devient trop important ou si les classes intermédiaires (genre B) n'ont pas besoin de X, c'est peut être le modèle qui est à revoir.  
Même si X n'est pas statique, tu peux envisager de l'exposer de façon plus globale au moyen d'une classe maintenant une collection (et là il y a des DP qui peuvent t'inspirer). Si chaque X est intimement lié à son parent, on en revient au problème initial.
 
Je te propose aussi d'essayer de nous expliquer concrètement le but de la manœuvre parce que là on nage un peu.


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

Marsh Posté le 11-06-2010 à 21:38:59    

Ce n'est pas évident à expliquer.
 
Le but de la manoeuvre, c'est d'arriver à recréer sous forme de classe des données stockées en base. Résultat je fais des requêtes sur ma base et j'interprète les résultats pour instancier des objets.
 
Comme cela est issu d'une base de données il faut que j'arrive à l'aide de la hierarchie entre mes classes à correctement traduire les différentes liaisons entre les tables de ma base.
 
Je gère une collection de A qui possède chacun leur propre collection de B. Malheureusement l'objet B est complexe lui aussi et possède donc sa collection de C. C qui, pour être correctement inetrprétée, a besoin de s'appuyer sur le dictionnaire X.
 
Je ne suis pas maitre du modèle de données donc les objets à gérer sont très complexes et inflexibles.
 
Au final j'ai aussi envisagé simplement de stocker C en l'état puis de l'enrichir à l'aide d'une méthode dans A. Mais pour cela il faut que je parcours la collection de B et pour chaque B que je parcours la collection de C, etc... Ca me semblait pas super optimisé.
 
NB : si vous n'avez rien compris, c'est normal :D

Reply

Marsh Posté le 11-06-2010 à 21:55:28    

Pour X : Si X est un dictionnaire du genre table de référence tu devrais exposer Collection<X> via une méthode statique sur X ou via un système de cache, plutôt que le trimballer à chaque fois. En plus ou à la place d'exposer la collection brute, expose des méthodes du genre récupérer X selon Id ou ce qu'il te faut.

 

Pour ABC : Si en base A, B, C... se référencent les uns les autres, ça ne me choque pas de transmettre à chacun la référence vers son parent, pour être en mesure de parcourir au final tout ça comme un arbre...

 

Rq : tes objets métiers côté code ne doivent pas nécessairement reprendre à l'identique tes tables, au contraire, tu auras tout intérêt à t'en détacher.

 

Je n'ai peut être rien compris. C'est possible d'avoir un truc genre diagramme UML ou MPD ?


Message édité par TotalRecall le 11-06-2010 à 21:57:31

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

Marsh Posté le 12-06-2010 à 00:51:04    

Je pense que tu as cerné le problème mais comme je développe pour le fun, je n'ai rien de propre sous la main pour l'intant.
 
C'est vrai qu'au final je me penchais vers un affichage via un treeview. Sinon je te rassure, je n'ai pas simplement repris les tables pour sortir A, B et C, j'ai un peu réfléchis à la question mais c'est vrai que je manque d'experience en POO...

Reply

Sujets relatifs:

Leave a Replay

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