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 :

Annuler l'instanciation d'une classe


Sujet :

VB.NET

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Annuler l'instanciation d'une classe


    Je me posais cette question... J'ai un constructeur de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Public Sub New(ByVal CsvFilename As String)
     
        End Sub
    Existe t-il un moyen pour annuler l'instanciation de la classe si par exemple l'argument n'est pas fournit au constructeur ? Donc en somme, au lieu que l'objet soit créé, qu'il reste à Nothing.



  2. #2
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Bonjour,

    Directement je ne sais pas, mais je sais que j'ai déjà utiliser des Factory qui s'occupe de retourner des instanciations de classes, et à ce moment, c'est donc possible.

    Un truc 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
    Public class Factory
     
    Public Function Classe1(byval parametre1 as string) as BLL.Classe1
     
        If String.IsNullOrEmpty(paramtre1) Then Return Nothing
        Return New BLL.Classe1(parametre1)
     
    End Sub
     
    Public Function Classe2() as BLL.Classe2
     
        Return New BLL.Classe2()
     
    End Sub
     
    End Class

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Merci pour cette astuce, ce qui m'a donné l'idée de faire ceci au sein de la classe elle-même avec le constructeur en privé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Public Shared Function SetInstance(ByVal CsvFilename As String) As ExportSANDRE
            If Not String.IsNullOrEmpty(CsvFilename) Then
                Return New ExportSANDRE(CsvFilename)
            End If
     
            Return Nothing
        End Function
    Un peu à la manière d'un singleton en fait.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    pour annuler la création d'une instance la seule méthode est de générer une exception

    ici vu que c'est un problème d'argument tu pourrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if CsvFilename = "" then throw new ArgumentNullException("CsvFilename est vide")
    if system.io.file.exists(CsvFilename) = false then throw new ArgumentException("le chemin n'existe pas " & CsvFilename)
    c'est ce qui est fait un peu partout dans le framework
    par contre l'appelant se prend une erreur donc il lui faut un try catch

    sinon la méthode du factory fonctionne aussi, à savoir ne pas appeler le new directement mais appeler une fonction qui fera le new si c'est nécessaire
    dans ce cas par contre on a plutot tendance à mettre le sub new en private (ce qui évite de pouvoir l'appeler et force l'utilisation du factory) et on met le factory en shared function sur la classe elle même (le private sub new y est accessible de là)

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut, l'exception me va bien, si elle permet en effet d’interrompre l'instanciation de la classe. L'utilisateur ne sera autre que moi donc je saurais qu'il faut que j'englobe l'appel par un blot try...catch.

  6. #6
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Je trouve un peu dommage d'utiliser les exceptions pour cela pour :

    1) Il faut en effet faire un Try-Catch chez l'appelant... pas très jolie
    2) la création d'un exception peut être plus ou moins longue en fonction de la taille de la pile d'appel...

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    c'est un choix selon le reste de l'application
    si ceci n'est pas censer arriver et qu'on log les erreurs le throw est bien, ca permet de regarder les rapports d'erreurs et donc de corriger le bug
    si ceci peut arriver alors lever une exception est un peu dommage en effet

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ce n'est effectivement pas censé arriver car le programme qui utilisera cette classe fera déjà un test en amont mais je préférais mettre une sécurité en plus, on ne sais jamais.

  9. #9
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    +1 pour le throw alors

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    à tous !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/10/2006, 15h45
  2. Instanciation d'une classe dans un CustomTag
    Par santana2006 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 30/09/2006, 12h08
  3. Réponses: 2
    Dernier message: 21/04/2006, 20h18
  4. instanciation d'une classe
    Par firejocker dans le forum C++
    Réponses: 6
    Dernier message: 15/11/2005, 11h54
  5. Réponses: 7
    Dernier message: 10/11/2005, 10h09

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