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 :
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):
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 :
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 :
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:
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.
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
Partager