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

fregolo52 1108 Messages postés mercredi 15 juin 2011Date d'inscription 10 juillet 2018 Dernière intervention - 3 avril 2006 à 15:08 - Dernière réponse : fregolo52 1108 Messages postés mercredi 15 juin 2011Date d'inscription 10 juillet 2018 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
sebseb42 495 Messages postés dimanche 6 juillet 2003Date d'inscription 9 novembre 2007 Dernière intervention - 3 avril 2006 à 15:26
3
Merci
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

Merci sebseb42 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de sebseb42
Meilleure réponse
bernie666 427 Messages postés mercredi 1 octobre 2003Date d'inscription 29 janvier 2008 Dernière intervention - 3 avril 2006 à 16:35
3
Merci
je te conseil une hashTable et dedans tu mes comme clef l'ID de tes cameras ;)

Merci bernie666 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de bernie666
fregolo52 1108 Messages postés mercredi 15 juin 2011Date d'inscription 10 juillet 2018 Dernière intervention - 3 avril 2006 à 16:18
0
Merci
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;
Commenter la réponse de fregolo52
fregolo52 1108 Messages postés mercredi 15 juin 2011Date d'inscription 10 juillet 2018 Dernière intervention - 3 avril 2006 à 16:32
0
Merci
Oups ok j'ai compris le 'as' (je croyais que c'était du VB).
Commenter la réponse de fregolo52
fregolo52 1108 Messages postés mercredi 15 juin 2011Date d'inscription 10 juillet 2018 Dernière intervention - 3 avril 2006 à 16:53
0
Merci
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.
Commenter la réponse de fregolo52
sebseb42 495 Messages postés dimanche 6 juillet 2003Date d'inscription 9 novembre 2007 Dernière intervention - 3 avril 2006 à 20:13
0
Merci
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 :)
Commenter la réponse de sebseb42
sebseb42 495 Messages postés dimanche 6 juillet 2003Date d'inscription 9 novembre 2007 Dernière intervention - 3 avril 2006 à 20:15
0
Merci
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.
Commenter la réponse de sebseb42
fregolo52 1108 Messages postés mercredi 15 juin 2011Date d'inscription 10 juillet 2018 Dernière intervention - 3 avril 2006 à 22:22
0
Merci
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 :-))
Commenter la réponse de fregolo52

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.