OVH Cloud OVH Cloud

ArrayList et classe

13 réponses
Avatar
wavemill
Bonjour,

Voici mon probl=E8me:

J'ai cr=E9e une classe que je voudrai instancier plusieurs=20
fois.
J'aurai voulu les mettre dans un array list pour pouvoir=20
y acceder suivant le choix de l'utilisateur.
Par exemple dans mon liste box

Classe maClasse =3D new Classe();

ArrayList maArraylist =3D new ArrayList;

maArraylist.Insert(0,maClasse);

if(Listbox.SelectedIndex =3D=3D 0)
{
maArraylist[0].mamethode();
}

Je n'arrive pas =E0 acc=E9der au fonction de chaque classe.

Vous remerciant d'avance,

wavemill

10 réponses

1 2
Avatar
Ambassadeur Kosh
en .Net, les collections ne sont pas typées comme on en a l'habitude avec la
genericité.
un ArrayList manipule des object.

ArrayList maArraylist = new ArrayList;
maArraylist.Add("youpi") ;
maArraylist.Add(new Classe()) ;
maArraylist.Add(25.6) ;


donc dans votre code, comment le compilateur peut il savoir / deviner que ça
doit accepter des Classe dans le Add, Remove, et [] et rien d'autre.

soit vous faites dans le genre gros porc. comme ceci.

// maArraylist[0] est un object. on demande donc poliment si c'est un Classe
Classe classe = (Classe)maArraylist[0] ;
classe.mamethode() ;

soit vous abandonnez l'ArrayList au profit de ceci

class ClasseCollection : CollectionBase
{
public void Add(Classe c)
{
List.Add(c) ;
}

public Classe this[int index]
{
get { return (Classe)List[index] ; }
set { List[index] = value; }
}

etc...
}

il va de soi que je daignerai plus vous adresser la parole si vous
choisissez la premiere solution :o)

la deuxieme répond aux exigences du typage. quand vous passez par le [] de
la ClasseCollection, le compilateur vois qu'il s'agit d'un Classe. tout le
reste est de l'implantation.
si vous passez autre chose, ça ne compilera pas. ce qui est le but recherché

et dans un avenir proche, vous écrirez directement ce genre de choses

List[Classe] liste = new List[Classe] ;

voila voila
Avatar
wavemill
Parfait, c'est exactement ce que je recherchais!
Merci beaucoup, j'ai pris la deuxieme solution, on peut
toujours se parler!! :-)
Merci!!
Avatar
Bismark Prods
Gros porc c'est vite dis ! Ca dépend du travail à faire ! Parfois pas le
choix de mélanger les objets !!!

"Ambassadeur Kosh" a écrit dans le message de
news:
en .Net, les collections ne sont pas typées comme on en a l'habitude avec


la
genericité.
un ArrayList manipule des object.

ArrayList maArraylist = new ArrayList;
maArraylist.Add("youpi") ;
maArraylist.Add(new Classe()) ;
maArraylist.Add(25.6) ;


donc dans votre code, comment le compilateur peut il savoir / deviner que


ça
doit accepter des Classe dans le Add, Remove, et [] et rien d'autre.

soit vous faites dans le genre gros porc. comme ceci.

// maArraylist[0] est un object. on demande donc poliment si c'est un


Classe
Classe classe = (Classe)maArraylist[0] ;
classe.mamethode() ;

soit vous abandonnez l'ArrayList au profit de ceci

class ClasseCollection : CollectionBase
{
public void Add(Classe c)
{
List.Add(c) ;
}

public Classe this[int index]
{
get { return (Classe)List[index] ; }
set { List[index] = value; }
}

etc...
}

il va de soi que je daignerai plus vous adresser la parole si vous
choisissez la premiere solution :o)

la deuxieme répond aux exigences du typage. quand vous passez par le [] de
la ClasseCollection, le compilateur vois qu'il s'agit d'un Classe. tout le
reste est de l'implantation.
si vous passez autre chose, ça ne compilera pas. ce qui est le but


recherché

et dans un avenir proche, vous écrirez directement ce genre de choses

List[Classe] liste = new List[Classe] ;

voila voila




Avatar
Vincent Lascaux
> Gros porc c'est vite dis ! Ca dépend du travail à faire ! Parfois pas le
choix de mélanger les objets !!!



J'aimerai bien un example concret...

--
Vincent
Avatar
Paul Bacelar
Ils devraient au moins implémenter une interface commune.


Paul Bacelar

"Vincent Lascaux" wrote in message
news:412d0feb$0$13684$
> Gros porc c'est vite dis ! Ca dépend du travail à faire ! Parfois pas le
> choix de mélanger les objets !!!

J'aimerai bien un example concret...

--
Vincent




Avatar
Bismark Prods
Hello Paul,

"Paul Bacelar" a écrit dans le message
de news:ekTQ%
Ils devraient au moins implémenter une interface commune.



Actuellement je termine de programmer une gestion complète de fichier MP3
autonome. J'ai utilisé une classe d'héritage de CollectionBase qui contient
à la fois des Boolean, des Int32, des instances de ma collection, des
Doubles, etc etc ! Pas moyen de faire autrement. (l'architecture n'est pas
de moi et est issu d'un autre langage bcp plus laxiste sur l'utilisation des
collections) Or donc pour éviter de tous re-pensé j'ai tout mélangé et ca
marche plutot bien ! :-)



Paul Bacelar



Bismark


"Vincent Lascaux" wrote in message
news:412d0feb$0$13684$
> > Gros porc c'est vite dis ! Ca dépend du travail à faire ! Parfois pas


le
> > choix de mélanger les objets !!!
>
> J'aimerai bien un example concret...
>
> --
> Vincent
>
>




Avatar
Ambassadeur Kosh
> Parfait, c'est exactement ce que je recherchais!
Merci beaucoup, j'ai pris la deuxieme solution, on peut
toujours se parler!! :-)
Merci!!



donc, il y'a encore des choses que vous devez savoir. si on utilise
ArrayList, le foreach considère que le type manipulé object.

donc (c'est pas trivial mais) on peut syntaxiquement ecrire foreach(double x
in collection) ou foreach(decimal in collection). selon le type reel de
l'object il assignera x avec la bonne valeur ou crashera en exception en
disant qu'il ne peut pas changer un chat en chien.

si vous utilisez CollectionBase directement, vous aurez le meme phenomene et
donc probleme. mais vous remarquerez que si vous utilisez une
StringCollection, le foreach refusera autre chose qu'une string. donc, c'est
possible de rendre le foreach moins permissif. le foreach / compilateur ne
se base pas sur [ ]. on peut trés bien faire une liste sans vouloir donner
un acces direct par un index. donc il utilise IEnumerable. en redefinissant
un Enumerator typé et les membres retournant de cet Enumerator, le foreach
fonctionnera comme souhaité.

je vous livre plus bas le resultat idéal. j'ai appellé la classe Dummy.
c'est facile à identifier. cette classe a été generée par Sharpdevelopp. il
y'en a plein d'autres. CodeSmith entre autre. moi, je me suis fait mon petit
xsl, dans lequel je range toutes mes classes generiques. et j'enumere les
instances dans un xml que je "compile" en fichier .cs. je me ferai une joie
de vous le filer.

évidement, si on avait la genericité, mais bon, on ne l'a pas, donc...

using System;
using System.Collections;

namespace Test
{
[Serializable()]
public class DummyCollection : CollectionBase
{
public DummyCollection() {}

public DummyCollection(DummyCollection val)
{ this.AddRange(val); }

public DummyCollection(Dummy[] val)
{ this.AddRange(val); }

public Dummy this[int index]
{
get { return ((Dummy)(List[index])); }
set { List[index] = value; }
}

public int Add(Dummy val)
{ return List.Add(val); }

public void AddRange(Dummy[] val)
{ for (int i = 0; i < val.Length; i++)
this.Add(val[i]);
}

public void AddRange(DummyCollection val)
{ for (int i = 0; i < val.Count; i++)
this.Add(val[i]);
}

public bool Contains(Dummy val)
{ return List.Contains(val); }

public void CopyTo(Dummy[] array, int index)
{ List.CopyTo(array, index); }

public int IndexOf(Dummy val)
{ return List.IndexOf(val); }

public void Insert(int index, Dummy val)
{ List.Insert(index, val); }

public void Remove(Dummy val)
{ List.Remove(val); }

// le point interessant est ici
public new DummyEnumerator GetEnumerator()
{ return new DummyEnumerator(this); }

public class DummyEnumerator : IEnumerator
{
IEnumerator baseEnumerator;
IEnumerable temp;

public DummyEnumerator(DummyCollection mappings)
{
this.temp = ((IEnumerable)(mappings));
this.baseEnumerator = temp.GetEnumerator();
}

public Dummy Current
{ get { return ((Dummy)(baseEnumerator.Current)); } }

object IEnumerator.Current
{ get { return baseEnumerator.Current; } }

public bool MoveNext()
{ return baseEnumerator.MoveNext(); }

bool IEnumerator.MoveNext()
{ return baseEnumerator.MoveNext(); }

public void Reset()
{ baseEnumerator.Reset(); }

void IEnumerator.Reset()
{ baseEnumerator.Reset(); }

}
}
}
Avatar
Ambassadeur Kosh
> > Ils devraient au moins implémenter une interface commune.

Actuellement je termine de programmer une gestion complète de fichier MP3
autonome. ... et ca
marche plutot bien ! :-)



ok. voila le cas . maintenant, ta collection, elle accepte un nombre
restreint de type. j'imagine que tu vas pas faire rentrer dedans des
FileWatcher ou des HamsterCollection. donc déja, un ArrayList, si tu Add
quelque chose d'indesirable, ça passera quand meme à la compile. et à
imaginer que plus tard tu autorise d'autre type et en interdise d'autre, vu
que tu as casté partout, le compilateur ne te dira rien sur les endroits
dependants du changement.

et j'imagine que les traitements que tu fais sont specifiques pour chaque
type, mais qu'ils s'inscrivent dans une generalité.

donc

abstract class Item
{
public abstract int TailleEnOctet() ;
public abstract void WriteToXml(XmlWriter writer) ;
...
}

class DoubleItem : Item...
class StringItem : Item...

- object systematique : je persiste dans mon affirmation. ça tiens de
l'inconscience.
- object a bon escient : je m'interoge. il y'a des rares cas comme
IDataRecord, ou peut être...

bon, puis c'est un peu tot pour le Troll de la rentrée. on va attendre
Septembre :o)
Avatar
Bismark Prods
LOL ! je suis meme une brute épaisse car à certains endroits je caste meme
pas ! je travail sur la gestion d'erreur de cast ... lol


"Ambassadeur Kosh" a écrit dans le message de
news:OwA%
> > Ils devraient au moins implémenter une interface commune.
>
> Actuellement je termine de programmer une gestion complète de fichier


MP3
> autonome. ... et ca
> marche plutot bien ! :-)

ok. voila le cas . maintenant, ta collection, elle accepte un nombre
restreint de type. j'imagine que tu vas pas faire rentrer dedans des
FileWatcher ou des HamsterCollection. donc déja, un ArrayList, si tu Add
quelque chose d'indesirable, ça passera quand meme à la compile. et à
imaginer que plus tard tu autorise d'autre type et en interdise d'autre,


vu
que tu as casté partout, le compilateur ne te dira rien sur les endroits
dependants du changement.

et j'imagine que les traitements que tu fais sont specifiques pour chaque
type, mais qu'ils s'inscrivent dans une generalité.

donc

abstract class Item
{
public abstract int TailleEnOctet() ;
public abstract void WriteToXml(XmlWriter writer) ;
...
}

class DoubleItem : Item...
class StringItem : Item...

- object systematique : je persiste dans mon affirmation. ça tiens de
l'inconscience.
- object a bon escient : je m'interoge. il y'a des rares cas comme
IDataRecord, ou peut être...

bon, puis c'est un peu tot pour le Troll de la rentrée. on va attendre
Septembre :o)




Avatar
Paul Bacelar
Un "is" ne serait pas plus propre que la gestion des erreurs de cast ?

La nécessité fait loi mais quand on peut faire des choses élégantes, il ne
faut pas s'en priver.


Paul Bacelar

"Bismark Prods" <xanaia#nospam#@urbanet.ch> wrote in message
news:
LOL ! je suis meme une brute épaisse car à certains endroits je caste meme
pas ! je travail sur la gestion d'erreur de cast ... lol


"Ambassadeur Kosh" a écrit dans le message de
news:OwA%
> > > Ils devraient au moins implémenter une interface commune.
> >
> > Actuellement je termine de programmer une gestion complète de fichier
MP3
> > autonome. ... et ca
> > marche plutot bien ! :-)
>
> ok. voila le cas . maintenant, ta collection, elle accepte un nombre
> restreint de type. j'imagine que tu vas pas faire rentrer dedans des
> FileWatcher ou des HamsterCollection. donc déja, un ArrayList, si tu Add
> quelque chose d'indesirable, ça passera quand meme à la compile. et à
> imaginer que plus tard tu autorise d'autre type et en interdise d'autre,
vu
> que tu as casté partout, le compilateur ne te dira rien sur les endroits
> dependants du changement.
>
> et j'imagine que les traitements que tu fais sont specifiques pour


chaque
> type, mais qu'ils s'inscrivent dans une generalité.
>
> donc
>
> abstract class Item
> {
> public abstract int TailleEnOctet() ;
> public abstract void WriteToXml(XmlWriter writer) ;
> ...
> }
>
> class DoubleItem : Item...
> class StringItem : Item...
>
> - object systematique : je persiste dans mon affirmation. ça tiens de
> l'inconscience.
> - object a bon escient : je m'interoge. il y'a des rares cas comme
> IDataRecord, ou peut être...
>
> bon, puis c'est un peu tot pour le Troll de la rentrée. on va attendre
> Septembre :o)
>
>




1 2