Tableau de pointeur d'objets différents (classes dérivées) [Résolu]

Signaler
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
-
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
-
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

Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
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
Messages postés
427
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
29 janvier 2008
1
je te conseil une hashTable et dedans tu mes comme clef l'ID de tes cameras ;)
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
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;
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
Oups ok j'ai compris le 'as' (je croyais que c'était du VB).
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
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.
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
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 :)
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
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.
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
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 :-))