Collection d'objets multi-types...

Signaler
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007
-
Messages postés
60
Date d'inscription
jeudi 12 avril 2007
Statut
Membre
Dernière intervention
16 mai 2012
-
Salut tout le monde,

J'ai plusieur objet (ex : Bateau, Avion, Voiture) et je souhaiterai faire une collection d'objets issues de ces classes différentes...
maCollection :
monBateau1
monAvion1
monAvion2
maVoiture1
monBateau2
(...)

Voilà donc comment je peux faire pour enregistrer tout ses objets étant de type différents dans une seule collection pour pouvoir y accéder et savoir quel est la couleur de maVoiture1 par exemple et le nombre de réacteur de monAvion2 ?

Merci d'avance

8 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Salut,
Moi ce que je ferais c'est une classe Vehicule, qui contient des enfants (Bateau, Avion, etc), et je stockerais tout ces éléments une collection typée (voire Generics).
Ensuite, si tu veux accéder à un élément globale comme la couleur d'une auto, suffit d'appeler la méthode correspondante de la classe Vehicule car à priori chaque Vehicule peut avoir une couleur (et pas seulement une auto).
Pour des attributs qui seraient dépendant d'un sous-type, comme par exemple la taille d'un pot d'échappement (qu'on ne trouve pas sur un avion ) tu peux faire un test avec le mot clef is :
if(monVehicule is Auto)

VC# forever
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Oui comme Bidou à part que j'aurais dérivé d'une interface IVehicule mais comme dans ton exemple tu veux connaîtres le nombre de réacteurs et qu'une voiture n'a pas de réacteur tu vas te retrouver a faire des casts et des "is, "as" alors tu peux bien tout mettre dans une collection d'objets ( ArrayList ).
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Les puristes diront "implementer une interface et non dériver" quoi que..
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Hum, je pensais en faite à une class abstraite Vehicule et de la on pourrait créer des interfaces IMotorisé, IRoule par exemple...

VC# forever
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007

oulà oulà 
Si quelqu'un aurait un exemple se serai super! Parsque les interfaces j'en ai fait une il y a 1 mois mais je ne maitrise pas et je ne comprends pas trop leur intéret...

J'ai pensé à un truc que je suis en train de mettre en place pour voir si ça peut le faire... il sajirai de faire une classe objet "unItem" qui a une propriété objet avion, une objet voiture et une objet bateau et ensuite créer une liste de type "unItem"...
Il suffirai ensuite de trouver la propriété qui n'est pas null pour savoir la nature de l'item..
bon je ne penses pas du tout que se soit très pro et surtout ça instancie beaucoup de propriété pour rien (ici les 2/3 quand même lol)

Je suis très curieux de voir un exemple avec une interface!
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Dans ton cas le plus simple, c'est une collection d'objets ( de type Object ) et les opérateurs is ou as.

ArrayList members = new ArrayList( ); // Collection d'objets.
members.Add( new Bidou( ) );
members.Add( new Lutinore( ) );


if ( members[ 0 ] is Bidou )
    MessageBox.Show( "Salut Bidou" );


if ( members[ 1 ] as Lutinore != null )
    MessageBox.Show( "Salut Lutinore" );


 


Un exemple si tu préfère implementer une interface ou une classe abstraite :

public interface IMember
{
    string Name { get; }
}


public sealed class Bidou : IMember
{
    public string Name { get { return "Bidou"; } }
}


public sealed class Lutinore : IMember
{
    public string Name { get { return "Lutinore"; } }
}


// ..


List< IMember > members = new List< IMember >( ); // Collection générique.
members.Add( new Bidou( ) );
members.Add( new Lutinore( ) );


foreach( IMember member in members )
    MessageBox.Show( member.Name );
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007

Merci bien pour cet exemple je vais méditer là dessus tout de suite
Messages postés
60
Date d'inscription
jeudi 12 avril 2007
Statut
Membre
Dernière intervention
16 mai 2012
1
bonjour,
 je viens de commencer en C#, et je dois écrire un Programme qui me permet de déssiner deux types de rectangles, de sorte que mes premiers rectangle du Types "un", je puisse les introduirent dans le rectangle du type "deux" à une position quelconque sans qu'il y ait superpositions de deux rectangles du type "un". et ils ne doivent pas déborder le rectangle de type "deux".
mersi de m'aider!!!!!!!