Tableau de pointeur d'objets différents (classes dérivées)

Résolu
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 - 3 avril 2006 à 15:08
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 - 3 avril 2006 à 22:22
Bonjour,

Je cherche un moyen de stocker mes éléments et de les retrouver facilement.
J'ai une classe principale (nommé Camera) et des classes dérivées (CameraAnalog, CameraNum ...). Au départ, je suis parti en faisant des collections pour chaque type. Mais quand je veux retrouver un élément d'après son ID, je suis obligé de scruter toutes les collections.
Après, je me suis dit que j'allais instancier les CameraAnalog et CameraNum et que j'allais sauvegarder le 'pointeur' dans une collection de Camera. En C++, je vois comment faire, mais en C# ? En gros faire un tableau de pointeur, mais je crois que ce n'est pas recommandé en C#.

Je ne prends surement pas la bonne méthode. Pouvez-vous me guider pour éviter que je dérive trop ?
Toutes mes données sont en mémoire volatile et je voudrais éviter la sérialisation.

Merci.

8 réponses

sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
3 avril 2006 à 15:26
ou se trouvent tes instance ? dans la mémoire non managée ? et sous quelle forme ? quel est le language que tu utilise ? qu'elle est l'architecture de ton programme (code natif mixé avec tu code managé ?) ?

si tes instance sont en mémoire non managé, tu peux essayer ceci : Marshal.PtrToStructure

sinon si tu es completement en mémoire managé, selon moi le meilleure serait de faire une liste de Camera, soit en utilisant un ArrayList, soit en utilisant List<Camera>, mais dans les deux cas, tu peux filtrer facilement et proprement de la sorte :

foreach (Camera generic_cam in MyListOfCamera)
{
CrocoCamera specific_cam = generic_cam as CrocoCamera;
if (specific_cam == null)
continue;

// traitement;
}

ainsi tu filtres pour n'exploiter que les CrocoCamera
J'espere avoir pu t'aider
3
bernie666 Messages postés 427 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 29 janvier 2008 1
3 avril 2006 à 16:35
je te conseil une hashTable et dedans tu mes comme clef l'ID de tes cameras ;)
3
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 avril 2006 à 16:18
Merci pour ces infos.
Pour tes questions, je développe en C# pur.
Si j'ai bien compris dans mon ArrayList je stocke à la volée les CrocoCamera, les CameraIP et après pour savoir ce que j'ai dedans je fais un cast et s'il me rend null c'est que c'est pas le bon type d'instance.
Pfff, dur dur le passage du C au C# (sans trop connaitre C++) :-)
en C# tu ferais ca :
CrocoCamera specific_cam = (CrocoCamera)generic_cam;
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 avril 2006 à 16:32
Oups ok j'ai compris le 'as' (je croyais que c'était du VB).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 avril 2006 à 16:53
Merci beaucoup, je vais explorer les 2 solutions qui me paraisse identiques.
Si j'ai bien compris la hashTable et une ArrayList optimisée pour la recherche d'éléments.
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
3 avril 2006 à 20:13
oui (pour ton post plus haut) l'operateur as et l'operateur de cast n'ont pas le meme fonctionnement, le cast leve une exception si le type n'est pas bon, il faut par conséquent mettre un bloc try/catch, ce qui est lourd... as renvoie tout simplement null dans ta variable si le type ne match pas, et la bonne instance si ca match, ce qui est tout de meme plus élégant :)
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
3 avril 2006 à 20:15
la solution de la table de hash dans laquelle tu stock les ID de tes camera ne solutionnera pas le type de camera que tu as stocker, et il te faudra tout de meme faire un cast.
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 avril 2006 à 22:22
Merci, vu que ce n'est pas un programme très volumineux en données (50 items grand max) l'arraylist sera assez performante.

PS: je développe avec VS2003, je viensde tester mon programme avec VC# Express, sacré différence de pref niveau graphique. (plus de temps mort dans les owner draw :-))
0
Rejoignez-nous