Problème d'utilisation d'une Class

cs_Shucky Messages postés 7 Date d'inscription samedi 7 juin 2008 Statut Membre Dernière intervention 9 juin 2008 - 7 juin 2008 à 17:16
cs_Shucky Messages postés 7 Date d'inscription samedi 7 juin 2008 Statut Membre Dernière intervention 9 juin 2008 - 9 juin 2008 à 13:51
Bonjour à tous,

Tout d'abord j'espere avoir bien choisi le thème du sujet si ce n'est pas le cas je tien à m'en excuser.

Je sollicite votre aide aujourd'hui car malgré mes recherches je ne trouve pas de réponses à ma question. J'ai un programme à faire un VB un window application j'ai donc :

Ma class form1 qui contient tout le code concernent les événements sur les boutons et autre et ma class perso voilà à quoi cela ressemble

Public Class  Form1
    'Mon code...
End Class

Public Class Liste
   'Mon code
End Class

Jusque là tous va bien mais je doit faire de façon que ma fonction liste gère aussi bien les Char, Integer ou String donc j'ai rajouté (Of ElementType) dans la déclaration de ma liste.
Je viens vers vous maintenant car lorsque j'appel ma liste dans ma Public Class Form1 cela me pose problème. Voici ce que j'ai besoin de faire

Public Class Form1
   Tableau_de_Liste(taille) As Liste(?????)
End Class

Public Class Liste (of ElementType)
   'Mon code...
End Class

En l'endroit des "????" je ne sais pas quoi mettre. En effet j'ai besoin d'un tableau qui me stock des listes aussi bien d'integer que de char ou string.
Est-ce que cela est possible au moins? Si oui comment faire? Si non comment contourner cette contrainte?

J'espere avoir été assez claire.

Je vous remercie d'avance

Shucky

12 réponses

Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
8 juin 2008 à 02:50
Salut Shucky,


Si tu as des Char, Integer ou String à mettre dans ta liste, le type String pourrais faire l'affaire. Le problème, c'est que tu ne pourra plus savoir de quel type était ta valeur avant de l'ajouter à la liste, car toute seront convertie en String. Par contre, si tu stoque tes valeurs sous forme d'Object, tu pourra le faire:

    Private Liste As New List(Of Object)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Liste.Add("Salut")

        Liste.Add(Chr(100))

        Liste.Add(149)

        Liste.Add(Chr(110))

        Liste.Add("123456")

        Liste.Add(123456)

        Liste.Add("5")


        For Each item As Object In Liste


            If TypeOf (item) Is System.String Then

                Console.WriteLine("String  : " & item.ToString)

            ElseIf TypeOf (item) Is System.Char Then

                Console.WriteLine("Char    : " & item.ToString)

            ElseIf TypeOf (item) Is System.Int32 Then

                Console.WriteLine("Integer : " & item.ToString)

            End If


        Next

    End Sub
0
cs_Shucky Messages postés 7 Date d'inscription samedi 7 juin 2008 Statut Membre Dernière intervention 9 juin 2008
8 juin 2008 à 10:50
Bonjour,

En fait j'ai une combobox ou l'utilisateur choisi le type qu'il veux. J'ai déjà pensé au String mais notre prof veux qu'on fasse la différence entre les types.

J'ai aussi pensé a faire comme tu as dit

Dim Liste_liste(taille) As Liste(Of Objet) mais après ce bout de code me pause problème

                    Select Case ComboBox1.Text
                    Case "Integer"
                    Liste_liste(nombre_de_liste) = New Liste(Of Integer)
                    Case "Char"
                         Liste_liste(nombre_de_liste) = New Liste(Of Char)
                    Case "String"
                           Liste_liste(nombre_de_liste) = New Liste(Of String)
                    End Select

Mais après ça me dit qu'il ne peut pas converti Integer, Char ou String en Systeme Object

Est-ce que tu vois ce que je veux dire?

Merci d'avance.

Shucky
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
8 juin 2008 à 17:10
D'après ton code, tu n'essaie pas de convertir un String, Integer ou Char en object, mais une liste d'Integer, String ou Char en liste d'Object.

Je ne suis pas sûr que tu procède de la bonne façon...

- Dois-tu créer une liste contenant différents types ou dois tu créer plusieurs listes chacune contenant un type différent?

- Ta classe Liste c'est quoi?
0
cs_Shucky Messages postés 7 Date d'inscription samedi 7 juin 2008 Statut Membre Dernière intervention 9 juin 2008
8 juin 2008 à 17:21
en fait je dois créer une class liste qui peut être de plusieurs type (type choisi par l'utilisateur).

C'est pour quoi je dois faire une Public Class Liste(Of elementType)
Donc j'ai une class Liste et une seul qui prend le type choisi par l'utilisateur

Maintenant dans mon code principale je dois géré plusieurs Listes, mais je dois les gérer peut importe leurs types, c'est pour quoi je souhaite les stocker dans un tableau

J'espère avoir était clair

Merci de tes réponses

Shucky
0

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

Posez votre question
scottmat Messages postés 438 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 23 janvier 2011 1
8 juin 2008 à 17:40
Tous dans une class !

Je pense que le plus simple serait de faire des class distincte pour chaque choix de l'utilisateur
0
cs_Shucky Messages postés 7 Date d'inscription samedi 7 juin 2008 Statut Membre Dernière intervention 9 juin 2008
8 juin 2008 à 17:44
le problème justement c'est que le prof veux qu'on gère tout a partir d'une seule class. Mon seul problème c'est le stockage de ces class.
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
8 juin 2008 à 17:58
"J'espère avoir était clair"

Par encore assez

<hr size="2" width="100%" />
Si tu dois créer plusieurs listes, chacune contenant des types différents :

Dim Tab_List(2) As IList
Tab_List(0) = New List(Of Object)
Tab_List(1) = New List(Of Object)
Tab_List(2) = New List(Of Object)

Avec ce code tu aura donc 3 listes dans lesquelles tu pourra ajouter des valeurs de n'importe quel type :

Tab_List(0).Add([Integer])
Tab_List(0).Add([String])
Tab_List(1).Add([Integer])

Tab_List(1).Add([String])

Tab_List(2).Add([Integer])

Tab_List(2).Add([String])

<hr size="2" width="100%" />
Si tu veux plutôt créer des listes contenant 1 seul type de donées, mais en avoir plusieurs (chacune stoquant des types différents) :

Dim Tab_List(2) As IList

Tab_List(0) = New List(Of String)

Tab_List(1) = New List(Of Integer)

Tab_List(2) = New List(Of Char)

Tu pourra donc ajouter des String à la liste Tab_List(0), des Integer à la liste Tab_List(1) et des Char à la liste Tab_List(2) :

' Si tu essai d'ajouter un autre type qu'un String à Tab_List(0), tu aura une erreur
Tab_List(0).Add([String])
Tab_List(0).Add([String2])


' Si tu essai d'ajouter un autre type qu'un Integer à Tab_List(1), tu aura une erreur

Tab_List(1).Add([Integer])
Tab_List(1).Add([Integer2])


' Si tu essai d'ajouter un autre type qu'un Char à Tab_List(2), tu aura une erreur

Tab_List(2).Add([Char])

Tab_List(2).Add([Char2])

<hr size="2" width="100%" />
Tu peux stoquer tes classes Liste sous forme de IList seulement si celle-ci implémentent IList (par exemple si elle sont dérivé de List)
0
cs_Shucky Messages postés 7 Date d'inscription samedi 7 juin 2008 Statut Membre Dernière intervention 9 juin 2008
8 juin 2008 à 18:07
je ne connais pas Ilist :s

Mais dans le principe c'est bien la deuxième partie de ton explication que j'ai besoin.

Merci des efforts que tu fais pour m'aider.

Shucky
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
8 juin 2008 à 18:48
OK

Tout d'abord, une liste "normal" dans .NET est une List(Of ...). Celle-ci impléments l'interface IList, cela te permet de stocker des listes de types différents en IList.

Donc si on résume, tu veux créer différents type de listes (liste d'integer, de string...) que tu veux stocker dans une même classe.
Autrement dit, c'est une liste de listes de différents types:

' La liste contenant les différents types de liste:
Private Lists As New List(Of IList)

' Ajout de nouveaux types de listes (liste de String et d'Integer dans ce cas):
Lists.Add(New List(Of String))
Lists.Add(New List(Of Integer))

' Ajout de nouveaux éléments aux listes. La 1ère liste est une liste de String :
Lists(0).Add("Salut")
Lists(0).Add("Bonjour")
' La 2ème liste est une liste d'Integer :
Lists(1).Add(13)
Lists(1).Add(481)

' Tu peux aussi recréer ta liste original pour faciliter sa manipulation:
Dim myStringList As List(Of String) = Lists(0)
myStringList.Add("Resalut")
myStringList.Add("ReBonjour")

' Identification du type des listes et affichage de leur contenu :
For Each List As IList In Lists
    If TypeOf (List) Is List(Of String) Then

       Console.WriteLine("Ceci est une liste de String, voici sont contenu:")
       For Each Value As String In List

           Console.WriteLine(Value)
       Next

    ElseIf TypeOf (List) Is List(Of Integer) Then
       Console.WriteLine("Ceci est une liste de Integer")
       For Each Value As Integer In List

           Console.WriteLine(Value)
       Next

    ElseIf TypeOf (List) Is List(Of Char) Then
       Console.WriteLine("Ceci est une liste de Char")
       For Each Value As Char In List

           Console.WriteLine(Value)
       Next

    EndIf

Next

' Cela t'affiche:
' Ceci est une liste de String :
' Salut
' Bonjour
' Resalut
' ReBonjour
' Ceci est une liste de Integer :
' 13
' 481
0
cs_Shucky Messages postés 7 Date d'inscription samedi 7 juin 2008 Statut Membre Dernière intervention 9 juin 2008
8 juin 2008 à 19:32
Bon voilà j'avais pas compris que les listes existaient sous la forme de List en VB, j'ai donc oublié la précision surement la plus importante :s.

Notre prof veut qu'on gère les listes sous forme de tableau voici un bout de ma class liste

Public Class Liste (of ElementType)
    Private element(taille) As ElementType
    Private suivant(taille) As Integer
    Private precedent(taille) As Integer

  'puis les différentes méthode que j'ai besoin

End Class

Du coups d'après ce que tu as dit plus haut et d'après ce que j'ai vu sur le net je crois que ça rendre la chose impossible?

Désolé pour les oublies mais j'avais pas compris certain truc (débutant en VB puisque première année de prépa)

Merci encore

Shucky
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
8 juin 2008 à 20:40
OK, si tu dois toi même gérer tes tableaux, c'est sûr que ca va compliquer les choses. Une Liste dans VB n'est rien d'autre qu'une classe gérant un tableau (la liste change la taille du tableau conteneur de façon dynamique lorsque tu ajoute ou supprime des éléments). Le plus simple est donc de créer ta classe Liste toi  même (comme tu l'a fais).

Mais c'est quoi l'idée? De ne pas utiliser les classes du framework en dehors de Array?
As-tu le droit d'utiliser les interfaces? (qui te permettront de créer une liste compatible avec les autre listes .NET)

Voilà la même chose avec des tableaux à la place des listes:

   ' Tableau de 'Array' (il contiendra d'autres tableaux)
    Private Lists(-1) As Array

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' Ajout d'un tableau de String à la liste de tableau:
        Dim NewStringTab(-1) As String
        Array.Resize(Lists, Lists.Length + 1)
        Lists(Lists.Length - 1) = NewStringTab
        ' Ajout d'un tableau d'Integer à la la liste de tableau:
        Dim NewIntegerTab(-1) As Integer
        Array.Resize(Lists, Lists.Length + 1)
        Lists(Lists.Length - 1) = NewIntegerTab

        ' Ajout de nouveaux éléments aux tableaux. Le 1er tableau contient des String :
        Dim myStringTab() As String = Lists(0)
        Array.Resize(myStringTab, myStringTab.Length + 2)
        myStringTab(myStringTab.Length - 2) = "Salut"
        myStringTab(myStringTab.Length - 1) = "Bonjour"
        Array.Resize(myStringTab, myStringTab.Length + 2)
        myStringTab(myStringTab.Length - 2) = "Hello"
        myStringTab(myStringTab.Length - 1) = "Coucou"
        Lists(0) = myStringTab
        ' le 2ème tableau contient des Integer :
        Dim myIntegerTab() As Integer = Lists(1)
        Array.Resize(myIntegerTab, myIntegerTab.Length + 2)
        myIntegerTab(myIntegerTab.Length - 2) = 13
        myIntegerTab(myIntegerTab.Length - 1) = 481
        Lists(1) = myIntegerTab

        ' Identification du type des listes et affichage de leur contenu :
        For Each Tab As Array In Lists
            If TypeOf (Tab) Is String() Then
                Console.WriteLine("Ceci est un tableau de String :")
                For Each Value As String In Tab
                    Console.WriteLine(Value)
                Next
            ElseIf TypeOf (Tab) Is Integer() Then
                Console.WriteLine("Ceci est un tableau d'Integer :")
                For Each Value As Integer In Tab
                    Console.WriteLine(Value)
                Next
            ElseIf TypeOf (Tab) Is Char() Then
                Console.WriteLine("Ceci est un tableau de Char :")
                For Each Value As Char In Tab
                    Console.WriteLine(Value)
                Next
            End If
        Next

    End Sub

Ceci est un tableau de String :
Salut
Bonjour
Hello
Coucou
Ceci est un tableau d'Integer :
13
481
0
cs_Shucky Messages postés 7 Date d'inscription samedi 7 juin 2008 Statut Membre Dernière intervention 9 juin 2008
9 juin 2008 à 13:51
Bonjour,

Je suis désolé je viens de m'aperçevoir de mon erreur

Je devais faire:

Dim tab(taille) As Object

tab(i) = New Liste (Of montype)

alors que moi je fesais

Dim tab(taille) As (Of Object)

donc ça posait problème

Encore merci de ton aide,

Shucky
0
Rejoignez-nous