2010-06-02 5 views
3

Je ne sais pas vraiment comment formuler la question alors s'il vous plaît ours avec moi ...Obtenir des informations d'une classe supérieure?

J'ai 3 classes: Serveur, base de données et table. Chaque classe a une propriété "Nom". Comment je veux que cela fonctionne est que chaque serveur peut avoir plusieurs bases de données et chaque base de données peut avoir plusieurs tables. Donc, dans la classe Server, j'ai cette propriété.

Private _databases As List(Of Database) 
Public Property Databases() As List(Of Database) 
    Get 
     Return _databases 
    End Get 
    Set(ByVal value As List(Of Database)) 
     _databases = value 
    End Set 
End Property 

Et j'ai quelque chose de similaire dans la classe Database pour les tables. Cela fonctionne bien maintenant parce que je peux faire quelque chose comme ceci pour obtenir toutes les bases de données dans le serveur.

For Each db In s.Databases 's being the server object 
     Debug.Print(db.Name) 

    Next 

Je voudrais étendre ces classes. Je souhaite que la classe de serveur gère toutes les informations de connexion et que les autres classes utilisent les informations de connexion de la classe de serveur.

Par exemple, je configure une classe de serveur et définissez la chaîne de connexion au serveur. Ensuite, je souhaite que la classe de base de données utilise la propriété serverclass.connectionstring pour se connecter au serveur et obtenir une liste de toutes les bases de données. Mais je veux garder ce code dans la classe de base de données. Comment puis-je faire ceci?

J'ai joint un code de ce que je veux faire.

Public Class Server 

Private _name As String 
Public Property Name() As String 
    Get 
     Return _name 
    End Get 
    Set(ByVal value As String) 
     _name = value 
    End Set 
End Property 


Private _databases As List(Of Database) 
Public Property Databases() As List(Of Database) 
    Get 
     Return _databases 
    End Get 
    Set(ByVal value As List(Of Database)) 
     _databases = value 
    End Set 
End Property 
End Class 

'-----New class 

Public Class Database 

Private _name As String 
Public Property Name() As String 
    Get 
     Return _name 
    End Get 
    Set(ByVal value As String) 
     _name = value 
    End Set 
End Property 


Private _tables As List(Of Table) 
Public Property Tables() As List(Of Table) 
    Get 
     Return _tables 
    End Get 
    Set(ByVal value As List(Of Table)) 
     _tables = value 
    End Set 
End Property 

'This is where I need help! 
Private Sub LoadTables() 
    dim connectionstring as string = server.connectionstring 'Possible? 

    'Do database stuff 
End Class 

Merci d'avoir lu!

Répondre

2

Vous devrez inclure une référence à la classe "owner" dans votre classe enfant.

Sans l'aide du code (par souci de concision), que vous avez maintenant

Server 
---------- 
Databases -----> Database 
Name    ------------ 
        Tables  -----> Table 
        Name    -------------- 
             Name 

Ce que vous voulez est quelque chose comme ceci:

Server 
---------- 
Databases -----> Database 
Name    ------------ 
^    Tables  -----> Table 
    |    Name    -------------- 
    --------------- Server    Name 
        ^    Database 
        |-------------------| 

La propriété Server sur la classe Database et la propriété Database sur la classe Table sont destinées à être des références à l'instance de chacun qui les possède.

+0

Merci c'est ce que je voulais faire. –

1

Transmettez le serveur à la base de données lors de sa construction et définissez un champ. C'est une forme très basique de dependency injection.

+0

+1 pour le lien et ce qu'il est appelé. Je cherche toujours à en savoir plus! –

1

Personnellement, je mettrais la base de données au courant du serveur sur lequel elle est stockée, afin que la base de données sache où se connecter en fonction du serveur qui lui est donné.

Cela ressemblerait à quelque chose comme:

public class Database { 
    public Database(Server server) { 
     Server = server; 
    } 

    public Server Server { get; private set; } 
} 
+0

+1 pour le code. Cela m'a aidé sur mon chemin. –

+0

Merci de m'avoir fait savoir que je vous ai apporté quelque chose. C'est gentil. =) –

Questions connexes