Bonjour,

Voici mon probleme. Je suppose qu'il est trivial pour quelqu un qui maitrise le jonglage entre classes, mais il ne l est pas pour moi ...

Dans une base de donnees, j ai des elements qui sont TOUS des noeuds. Or certains de ces noeuds sont des reservoirs et ont donc des attributs que les autres noeuds n'ont pas (par exemple une capacité de stockage d'eau), mais ont tous les attributs des noeuds.

C'est pourquoi, j ai crée une classe My_node avec tous les attributs des noeuds :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
Public Class My_node
    Public node_id As Integer
    Public type_id As Integer
    Public name As String
    Public X As Single
    Public Y As Single
    Public Water_company As String
    Public WRZ As String
    Public RWSM_type As String
End Class
et une classe My_Reservoir qui inherite de ma classe My_node a laquelle j'ajoute les attributs specifiques a un reservoir (Capacity et Initial Storage):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Class My_Reservoir
    Inherits My_node
    Public Capacity As Integer
    Public Initial_Storage As Integer
 
    Sub Fromnode(ByVal anode As My_node)
        Me.name = anode.name
        Me.node_id = anode.node_id
        Me.RWSM_type = anode.RWSM_type
        Me.type_id = anode.type_id
        Me.Water_company = Me.Water_company
        Me.WRZ = anode.WRZ
        Me.X = anode.X
        Me.Y = anode.Y
    End Sub
End Class
(Notez la Sub Fromnode car ma question porte sur ca)

De plus, chaque noeud (et donc aussi reservoir) est attribué à ce que j appelle une "water resource zone" (WRZ). qui est donc un groupe noeuds. D'ou Ma classe My_WRZ :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
Public Class My_WRZ
    Public Water_company As String
    Public WRZ As String
    Public WRZ_Reservoir As New My_Reservoir
    Public WRZ_Junction As New My_node
    Public WRZ_WTW As New My_node
    Public WRZ_Dembis As New My_node
    Public WRZ_Dem As New My_node
End Class
COmme vous pouvez le voir ci-dessus, une WRZ contient donc des noeuds classiques (My_node) et un reservoir (My_reservoir).

Vous suivez jusque la ?

Dans ma Forme (je connais pas le nom en francais sry), j'utilise 2 dictionnaires. Un pour mes noeuds et un pour Mes WRZ :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
  Dim Dico_nodes As New Dictionary(Of Integer, My_node)
Dim Dico_WRZ As New Dictionary(Of String, My_WRZ)
Ce que je souhaite faire est donc de lire les attributs de chaque noeud de ma base de données. Les ajouter a mon dictionnaire de noeuds, puis mettre a jour mon Dictionnaire de WRZ.

Le code que j utilise (et qui semble fonctionner) est le suivant:


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Dim SQLreader1 As SQLiteDataReader = SQLcommand1.ExecuteReader()
        While SQLreader1.Read()
            Dim Anode As New My_node
            Anode.node_id = SQLreader1(0)
            Anode.type_id = SQLreader1(2)
            Anode.name = SQLreader1(3)
            Anode.X = SQLreader1(5)
            Anode.Y = SQLreader1(6)
            Anode.Water_company = SQLreader1(7)
            Anode.WRZ = SQLreader1(8)
            Anode.RWSM_type = SQLreader1(9)
            Dico_nodes.Add(Anode.node_id, Anode)
 
            If Dico_WRZ.ContainsKey(Anode.WRZ) = False Then
                Dim AWRZ As New My_WRZ
                AWRZ.Water_company = Anode.Water_company
                AWRZ.WRZ = Anode.WRZ
                Dico_WRZ.Add(AWRZ.WRZ, AWRZ) 
            End If
 
            If Anode.RWSM_type = "WRZ Reservoir" Then
                Dico_WRZ(Anode.WRZ).WRZ_Reservoir.Fromnode(Dico_nodes(Anode.node_id))
            ElseIf Anode.RWSM_type = "WRZ WTW" Then
                Dico_WRZ(Anode.WRZ).WRZ_WTW = Dico_nodes(Anode.node_id)
            ElseIf Anode.RWSM_type = "WRZ Junction" Then
                Dico_WRZ(Anode.WRZ).WRZ_Junction = Dico_nodes(Anode.node_id)
            ElseIf Anode.RWSM_type = "WRZ Dembis" Then
                Dico_WRZ(Anode.WRZ).WRZ_Dembis = Dico_nodes(Anode.node_id)
            ElseIf Anode.RWSM_type = "WRZ Dem" Then
                Dico_WRZ(Anode.WRZ).WRZ_Dem = Dico_nodes(Anode.node_id)
            End If
 
        End While
        SQLreader1.Close()
Mon probleme est que je ne comprends pas pourquoi si mon noeud est un reservoir, je doive utiliser la ligne de code suivante sans pouvoir tout simplement dire que tel noeud est le reservoir de ma WRZ.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
Dico_WRZ(Anode.WRZ).WRZ_Reservoir.Fromnode(Dico_nodes(Anode.node_id))
Je suis quasiment sur que ce que j ai ecris dans mon code est du bidouillage bancal, mais je n'arrive pas a mettre le doigt sur une solution plus "propre" ...

Merci.

Slumpy