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 :

POO : surcharge de méthode statique


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut POO : surcharge de méthode statique
    Hello,

    Etant loin d'être une bête en POO (et ne trouvant pas mon bonheur sur google), je me tourne vers vous.

    Voici mon problème :

    Soit une classe A, B et C où B et C héritent de A.

    Dans l'application, je vais être amener à utiliser des List(Of A) qui seront remplies d'un mélange d'instances de B et de C.

    L'application devra être capable de sauvegarder ces objets dans un DB. Pour éviter d'avoir à appeler une méthode Save sur chaque objet, j'avais dans l'idée de créer une méthode statique (Shared) dans A qui serait surchargée dans B et dans C histoire d'avoir le comportement adéquat pour chaque type d'objet.

    Seulement VS me signale que Shared et Overridable ne sont pas compatibles...

    J'ai aussi envisager de créer une interface ISavable(Of T) qui serait implémentée par A (et donc par B et C également) mais le problème est le même... Une méthode d'une interface ne peux pas être définie comme statique..

    Je souhaite que cette méthode soit statique pour des raisons logiques. Je pourrais très bien ne pas la rendre statique mais je trouve illogique qu'une instance s'occupe de la persistance d'une autre instance qu'elle même.

    Que feriez-vous ?

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    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 175
    Points : 25 116
    Points
    25 116
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Seulement VS me signale que Shared et Overridable ne sont pas compatibles...
    en effet ce n'est pas possible d'overrider un membre shared


    Citation Envoyé par Kropernic Voir le message
    Une méthode d'une interface ne peux pas être définie comme statique..
    ce n'est pas possible non plus en effet ...

    une méthode Save non shared à définir sur chaque classe ca ne te convient pas ?
    quitte à avoir une méthode shared sur A qui demande un list(of A) et qui ferait une transaction si nécessaire

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Citation Envoyé par Pol63 Voir le message

    une méthode Save non shared à définir sur chaque classe ca ne te convient pas ?
    quitte à avoir une méthode shared sur A qui demande un list(of A) et qui ferait une transaction si nécessaire
    Bin s'il n'y a vraiment pas moyen, je me dirigerai vers une méthode Save non shared qui sauvegardera l'instance à laquelle il appartient. Mais j'aurais aimé pouvoir offrir la possibilité à la couche graphique de pouvoir sauver toute la collection d'un coup plutôt que de faire une boucle (même si bien sûr derrière, il y aura une boucle).

    Et comme je le disais, d'un point de vue logique, pour pouvoir sauver plusieurs A d'un coup, la méthode Save ne "peut" pas être non shared car cela n'a pas de sens que l'instance i de A s'occupe de la persistance en DB des instances j..n.

    Il est fort possible que ce soit ma conception qui ne soit pas juste aussi ^^.

    J'suis en train de me dire que je pourrais créer une classe qui se chargerait de la persistances de différents objets. Un peu comme une fabrique sauf qu'elle ne crée pas les objets mais les persiste en DB.

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Bin s'il n'y a vraiment pas moyen, je me dirigerai vers une méthode Save non shared qui sauvegardera l'instance à laquelle il appartient.
    Le truc c'est qu'une méthode shared n'appartient pas à une instance de part ça définition. Elle ne peut pas accéder aux membres non shared de la classe à laquelle elle appartient.

    Exemple :
    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
    Public Class Form1
     
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim i As New test
            i.subtest() ' !!! Avertissement !!!
            test.subtest() ' Correct
            test.subtest2(i) ' Correct
        End Sub
    End Class
     
    Public Class test
        Property p1 As String
     
        Shared p2 As String
     
        Shared Sub subtest()
            Debug.WriteLine(p1) ' !!! Erreur !!!
            Debug.WriteLine(p2) ' Correct 
        End Sub
     
        Shared Sub subtest2(t As test)
            Debug.WriteLine(t.p1) ' Correct 
            Debug.WriteLine(p2) ' Correct 
        End Sub
    End Class
    Citation Envoyé par Avertissement
    Avertissement 1 Accès d'un membre partagé, d'un membre de constante, d'un membre enum ou d'un type imbriqué via une instance*; l'expression qualifiante ne sera pas évaluée. C:\Users\wauthy\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 5 9 WindowsApplication1
    Citation Envoyé par Erreur
    Erreur 2 Impossible de faire référence à un membre instance d'une classe à partir d'une méthode partagée ou d'un initialiseur de membre partagé sans une instance explicite de la classe. C:\Users\wauthy\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 18 25 WindowsApplication1
    Donc si tu veux faire une méthode de sauvegarde shared qui sauvegarde une instance en particulier, il faut absolument que tu lui passe en paramètre l'instance à sauvegarder comme dans la méthode subtest2 (désolé c'est du vite fait) et du coup tu ne lies plus la sauvegarde d'une instance à une autre vu que la méthode shared n'est pas liée à une instance en particulier.

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Merci Cap'tain Obvious ! ^^

    Evidemment qu'il faut passer les infos des instances à sauvegarder !

    Dans ma tête, cela aurait donné quelque chose du genre :

    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
    Public Class A
     
        Public Sub New()
        End Sub
     
        Public Overridable Shared Sub Save(objects as List(Of A))
            'faire la sauvegarde ici
        End Sub
    End Class
     
    Public Class B
        Inherits A
     
        Public Sub New()
            Mybase.New()
        End Sub
     
        Public Overrides Shared Sub Save(objects as List(Of B))
            'faire la sauvegarde ici
        End Sub
    End Class
     
    Public Class C
        Inherits A
     
        Public Sub New()
            Mybase.New()
        End Sub
     
        Public Overrides Shared Sub Save(objects as List(Of C))
            'faire la sauvegarde ici
        End Sub
    End Class
    Sauf que ce n'est pas possible ^^

    EDIT : Et à côté de ça, il est fort probable qu'il y ait également une méthode Save non shared qui ne prend pas de paramètre et qui s'occupe de la sauvegarde de l'instance courante.

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    D'après tes explications il s'agit de sauvegarder la liste d'objets directement. Dans ce cas je créerais une classe qui hérite de List (ou autre type de collection selon les besoins....) :

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Class MyList
    	Inherits List(Of A)
     
    	Public Sub Save()
                ' Ici à l'aide du mot clef "Me" tu peux manipuler ta liste
    	End Sub
    End Class
    Comme ça tu as juste à utiliser ce type de liste pour pouvoir sauvegarder ta liste directement. Et donc dans ton code :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim list = New MyList()
     
    ' ... Ton code
     
    list.Save()
    Est-ce que ça répond à ta problématique ?

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Ca veut dire que si ce cas se présente n fois, je vais devoir avoir n classes dérivées de List et que mon collègue devra utiliser explicitement ces types de listes. Suis pas certain qu'il va comprendre l'intérêt... (faut composer avec ces choses-là aussi ^^)

    Tant pis, boucle ce sera ^^.

    Sur ce, je m'en vais ouvrir un autre discussion sur l'utilisation des DTO dans la BLL car je crois que je me perds un peu...

  8. #8
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    De toute façon à un moment où à un autre tu seras obligé de faire une boucle Donc que ça soit fait pour appeler la méthode Save de chaque objet, ou au niveau de la liste directement, ça ne changera pas grand chose. Il faut juste choisir.

    Je ne pense pas qu'il faille tenir compte des capacités de ton collègue, il faut faire ce qui est propre et normal pour du code. Ensuite à toi de faire une doc pour expliquer cela, et éventuellement de le former. Mais il ne faut pas niveler par le bas, ça mène à des choses absurdes qui seront peut-être compréhensibles par ton collègue, mais ton successeur dans 2 ou 3 ans, avec un bon niveau, n'y comprendra rien.

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/10/2008, 23h17
  2. Réponses: 5
    Dernier message: 26/10/2008, 12h28
  3. [POO] Surcharge de méthode __call
    Par ascito dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2008, 20h19
  4. [POO] Classes et méthodes statiques
    Par Info-Rital dans le forum Langage
    Réponses: 1
    Dernier message: 20/12/2007, 13h00
  5. [POO] Surcharge de méthode
    Par ouioui2000 dans le forum Langage
    Réponses: 4
    Dernier message: 09/03/2006, 15h25

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