IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Problème pour hériter d'une class et conseil POO [Débutant]


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut Problème pour hériter d'une class et conseil POO
    Bonjour tous le monde,
    je voudrais ajouter une méthode à ma classe qui gère les fichiers .ini mais sans toucher à la classe de base.
    IniFile est la classe principale (Publique) auquel on accède depuis le programme principale.
    En toute logique j'ai donc commencé par créer une nouvelle classe INI dérivée de IniFile et surcharger la propriété 'Item' pour pointer non plus sur IniFileSection mais sur la nouvelle class IniSection qui devra implémenter 'GetValue', en me disant que IniSection sera dérivée de IniFileSection. Jusque là pas de problème.
    Pour info : IniFileSection stocke les clés.

    Problème :
    le constructeur de IniFileSection et donc également de IniSection demande 2 paramétres (Parent as IniFile, Section as IniFileSectionStart). Ceux qui veux dire que IniFileSection fait référence à la classe parent IniFIle. Et c'est là que les ennuis commence je crois :
    Dans ma classe dérivée INI, j'ai créer une instance de INISection et s'en ai suivi un jolie overflow exception.
    Il me semble que tout mes ennuis proviennement de cette instance de IniFile dans IniFileSection, vous pouvez confirmer ?
    Est ce correcte d'un point de vue POO de procéder comme ceci ? Il me semble que ça enlève tout possibilité d’héritage non ?
    Question subsidiaire : Comment modifier la classe pour se passer de cette instance de INIFile dans INIFileSection (je peux fournir plus de code si besoin) ?

    Enfin j'ai une solution : celle d'abandonner l’héritage pour placer ma méthode GetValue directement dans IniFileSection mais le but est de comprendre le probléme et comment faire une classe qui puisse être dérivée facilement dans les règles de l'art et ainsi pouvoir facilement l'améliorer.

    Extrait du code de la classe de base IniFile :
    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
    Public Class IniFile
            Friend sections As New List(Of IniFileSection)()
            Friend elements As New List(Of IniFileElement)()
     
            Public Sub New()
            End Sub
     
            Public Sub New(path As String) ' FromFile
               ......
            End Sub
     Default Public ReadOnly Property Item(sectionName As String) As IniFileSection
                Get
                    Dim sect As IniFileSection = getSection(sectionName)
                    .......
                    Return sect
                End Get
            End Property
    End Class

    Extrait du code de la classe de base IniFIleSection :
    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
    Public Class IniFileSection
            Friend elements As New List(Of IniFileElement)()
            Friend sectionStart As IniFileSectionStart
            Friend _parent As IniFile
     
            Friend Sub New(parent As IniFile, sect As IniFileSectionStart)
                sectionStart = sect
                _parent = parent
            End Sub
     
       Default Public Property Item(keyName As String) As String
                Get
                    Dim v As IniFileValue = getValue(keyName)
                    Return If(v Is Nothing, Nothing, v.Value)
                End Get
                Set(value As String)
                    Dim v As IniFileValue
                    v = getValue(keyName)
     
                    If v IsNot Nothing Then
                        v.Value = value
                        Return
                    End If
                    setValue(keyName, value)
                End Set
            End Property
    End Class
    Utilisation de la méthode depuis le programme principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ' Méthode d'origine de la classe de base :
    Dim Valeur As String = INI1("Section1")("Clé1") ' On récupère un String
    ' Nouvelle méthode de la classe dérivée :
    Dim Valeur As Integer = INI1("Section1").GetValue(Of Integer)("Clé1") ' On récupère une valeur typée
    Squelette d'implémentation de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Function GetValue(Of T)(ByVal KeyName As String) As T
    .....
    Return Value ' Retour la valeur typée (of T)
    End Function
    Je vous remercie beaucoup pour votre nouvelle aide.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pas compris

    sinon c'est utile de faire une classe héritée si le code qu'on ajoute n'a rien à faire dans la classe de base, et là il me semblerait que ca a toute sa place dans la classe de base
    enfin si tu veux bien ajouter un autre point d'entrée générique (of T) alors que tu en as déjà un as object

    et au passage tu n'est pas obligé de spécifier le type s'il est devinable par vs
    .GetValue(Of Integer) => .GetValue
    dans ton code vu que c'est pour mettre dans un integer vs sait que c'est of integer
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    pas compris
    Désolé, j'aurais du mettre plus de codes mais je crains qu'il faille analyser le problème dans sa globalité et je ne souhaite polluer le site avec pleins de lignes de codes.
    En fait de mon point de vue d’éternel débutant il me semble qu'il doit exister une certaine hiérarchie avec les classes et on doit éviter d'avoir trop d'interactions entre elles :
    Par exemple : j'ai une classe principale Class1 qui manipule des objets Class2. Mais dans mon cas Class2 possède une instance de Class1, c'est clair que ça facilite les actions sur Class1 depuis Class2 mais je me dis toujours que c'est une solution de facilité et que ce n'est pas vraiment correcte de faire comme ça. Peut-être que je me pose trop de questions ou que ça n'a pas de sens mais c'est quand même une question que je me pose .

    Du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Class Class1
            Private List1 As New List(Of Class2)()
    .....
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Class Class2
       Private _parent As Class1
            Public Sub New(parent As Class1)
                _parent = parent
            End Sub
    ' D'ici on à accès à toutes les propriétés et méthodes de Class1 via l'objet _parent !!!
    End Class
    @Pol63 : Merci beaucoup pour l'astuce qui m’intéresse énormément mais hélas je n'ai pas réussi à me passer de (Of T), ai-je manqué quelque chose ?

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ca arrive d'avoir des classes filles qui doivent connaitre leur parent
    pour éviter ca l'autre solution c'est d'avoir des évènements, classe2 lève un event et classe1 qui a une référence de classe2 est abonné et fait le traitement nécessaire
    mais ce n'est pas forcément mieux (je pense même que c'est moins bien, mais de peu)

    pour le of j'ai du dire une connerie, il déduis bien le type quand un paramètre est as T, mais en effet quand c'est le type de sortie il n'a pas l'air de savoir qu'il peut se débrouiller ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci beaucoup Pol63,
    Je marque en résolu puisque mes classes ne semble pas être prévu pour faire de l'héritage même si en vérité je ne sais pas trop ce qui cloche.
    Si il y en a qui veulent réagir sur ce qui à été dit je suis pas loin....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/02/2013, 11h32
  2. Impossible d'hériter d'une classe pour des raisons de sécurité
    Par padodanle51 dans le forum Silverlight
    Réponses: 7
    Dernier message: 15/06/2010, 16h19
  3. Problème de construction d'une classe
    Par AraBorLeg dans le forum Langage
    Réponses: 2
    Dernier message: 05/12/2005, 19h07
  4. Réponses: 7
    Dernier message: 25/03/2005, 14h05
  5. Réponses: 12
    Dernier message: 01/07/2004, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo