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 :

Heritage et type d'objet


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 9
    Points : 13
    Points
    13
    Par défaut Heritage et type d'objet
    Bonjour à tous.
    Alors voilà je vous explique mon problème.

    Voilà l'héritage de mes classes:

    Classe Personnage:
    - Personnage
    ___- HumainInfos
    ______- NameInfos
    _________- Infos
    ____________- ContextInfos

    Classe Monstre:
    - Monstre
    ___- Infos
    ______- ContextInfos

    Maintenant j'ai une fonction qui permet de définir le type de mon attribut en fonction d'un nombre entier fournit en paramètre.

    Voilà un bout de code du fonctionnement de cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public ActorInfos As Object
    Public Sub InitActorInfos(ByVal Type As Integer)
         Select case Type
            Case 0: 'Personnage
                 ActorInfos = New Personnage()
     
            Case 1: 'Monstre
                 ActorInfos = New Monstre()
         End Select
    End Sub
    Maintenant comment puis-je simplifier ce code ?

    Voilà, merci par avance,
    Bonne soirée

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    bonjour,

    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 ActorInfos As Object
        Public Function InitActorInfos(ByVal Type As Integer) As Object
            Select Case Type
                Case 0 'Personnage
                    Return New Personnage()
                Case 1 'Monstre
                    Return New Monstre()
                Case Else
                    Return Nothing
            End Select
        End Function
     
    'utilisation ...
            ActorInfos = InitActorInfos(0)
    '...
            Dim unPersonnage As Personnage = DirectCast(ActorInfos, Personnage)
    Avec directcast il est possible de le transtyper ActorInfos dans le type réel.
    A+, hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 9
    Points : 13
    Points
    13
    Par défaut
    Bonsoir,
    Merci pour votre réponse rv26t mais cela ne correspondais pas exactement à ce que je cherchai à faire.
    Cependant mon problème est résolu.
    J'ai utilisé une interface pour faire ce que je voulais.
    Voici un 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
    Public Interface IInitialisable
     
        Sub InitClass()
     
    End Interface
     
    Public Class Class1
        Implements IInitialisable
     
        Public ID As UInteger = 52
     
        Public Sub InitClass() Implements IInitialisable.InitClass
            'Instruction propre à Class1...
        End Sub
     
    End Class
     
    Sub Main()
        Dim ObjectClass As Object = GetClass(36)
        If ObjectClass Is Nothing Then Exit Sub
        Dim iObjectClass As IInitialisable = CType(ObjectClass, IInitialisable)
     
        iObjectClass.InitClass()
    End Sub
    Bonne soirée.

  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
    le type as integer c'est pas top, il y a les enums pour faire plus joli

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public enum TypeEnum
      personnage = 0
      monstre = 1
    end enum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function InitActorInfos(ByVal Type As TypeEnum) As Iqqch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim a = InitActorInfos(personnage)
    ca permet d'avoir de l'intellisense et d'éviter de chercher


    après pour éviter le select case géant il y a des possibilités, le dictionary(of TypeEnum, System.Type) en est une, tu fais un .add par type, et dans le factory au lieu du select case tu fais un return createinstance(dico(Type)) (casté)
    enfin un truc dans le genre
    après pour éviter les .add dans le dico il y a aussi d'autres méthodes, comme se baser sur le nom de l'enum pour trouver la classe (pas très propre ^^) ou peut etre un attribut sur chaque classe et un peu de reflection, là ca permet de faire évoluer le code sans qu'il y ait des tas de liens à modifier car une classe devient automatiquement utilisée bien que non citée dans le "moteur"
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    @Pol63 Merci pour l'info
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    après pour éviter le select case géant il y a des possibilités, le dictionary(of TypeEnum, System.Type) en est une, tu fais un .add par type, et dans le factory au lieu du select case tu fais un return createinstance(dico(Type)) (casté)
    enfin un truc dans le genre
    1ère étape de recherche

    L'enum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Enum TypePersonnage
        Humain = 0
        Monstre = 1
    End Enum
    Les classes de base
    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
    34
    Class Personnage
        Private mType As TypePersonnage
        Public Property Type() As TypePersonnage
            Get
                Return mType
            End Get
            Set(ByVal value As TypePersonnage)
                mType = value
            End Set
        End Property
        Public Sub New()
        End Sub
        Public Sub New(ByVal LeType As TypePersonnage)
            Type = LeType
        End Sub
    End Class
    Class Humain
        Inherits Personnage
        Public Sub New()
            Type = TypePersonnage.Humain
        End Sub
        Public Sub New(ByVal LeType As TypePersonnage)
            MyBase.New(LeType)
        End Sub
    End Class
    Class Monstre
        Inherits Personnage
        Public Sub New()
            Type = TypePersonnage.Monstre
        End Sub
        Public Sub New(ByVal LeType As TypePersonnage)
            MyBase.New(LeType)
        End Sub
    End Class
    Préparation à l'utilisation et méthode de création
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class frmClasseDyn
     
        Public DicoPersonnage As Dictionary(Of TypePersonnage, System.Type) = New Dictionary(Of TypePersonnage, System.Type)
     
        Private Sub frmClasseDyn_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            DicoPersonnage.Add(TypePersonnage.Monstre, GetType(Monstre))
            DicoPersonnage.Add(TypePersonnage.Humain, GetType(Humain))
        End Sub
     
        Public Function InitPersonnage(ByVal LeType As TypePersonnage) As Object
            Return Activator.CreateInstance(DicoPersonnage(LeType), LeType)
        End Function
    Utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Dim unMonstre As Monstre = InitPersonnage(TypePersonnage.Monstre)
    Il me reste une question => je suis obligé de redéfinir le constructeur avec un paramètre dans les classes dérivées, alors que je n'apporte aucun élément supplémentaire. (cela m'oblige à écrire du code en plus, ai-je loupé quelque chose?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Public Sub New(ByVal LeType As TypePersonnage)
            MyBase.New(LeType)
        End Sub
    Comment éviter cela ?

    Avez-vous ne idée ?

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #7
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Sub New()
            Type = TypePersonnage.Monstre
        End Sub
        Public Sub New(ByVal LeType As TypePersonnage)
            MyBase.New(LeType)
        End Sub
    pourquoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub New()
        MyBase.New(TypePersonnage.Monstre)
    End Sub
    suffit non ?


    sinon tu essayes de faire le code d'exemple ou tu essaies de comprendre comment on fait ca (ou les 2 ^^) ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Sub New()
            Type = TypePersonnage.Monstre
        End Sub
        Public Sub New(ByVal LeType As TypePersonnage)
            MyBase.New(LeType)
        End Sub
    pourquoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub New()
        MyBase.New(TypePersonnage.Monstre)
    End Sub
    suffit non ?


    sinon tu essayes de faire le code d'exemple ou tu essaies de comprendre comment on fait ca (ou les 2 ^^) ?
    Les 2 ^^

    Mais en ne mettant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub New()
        MyBase.New(TypePersonnage.Monstre)
    End Sub
    suffit non ?
    j'obtient à l'execution
    valeur de ex.message
    Le constructeur sur le type 'WindowsApplication1.Monstre' est introuvable
    sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Return Activator.CreateInstance(DicoPersonnage(LeType), LeType)
    Alors que dans l'autre cas cela fonctionne.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    J'aurais voulu écrire ceci
    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
    Class Personnage
        Private mType As TypePersonnage
        Public Property Type() As TypePersonnage
    '...
        Public Sub New()
        End Sub
        Public Sub New(ByVal LeType As TypePersonnage)
            Type = LeType
        End Sub
    End Class
    Class Humain
        Inherits Personnage
        Public Sub New()
            Type = TypePersonnage.Humain
        End Sub
    End Class
    Class Monstre
        Inherits Personnage
        Public Sub New()
            Type = TypePersonnage.Monstre
        End Sub
    End Class
    Ou le new avec le paramètre serait hérité, et donc ne pas le réécrire.
    Note : j'ai la même erreur qu'avec ta méthode.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  10. #10
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Return Activator.CreateInstance(DicoPersonnage(LeType))
    vu que j'ai retiré le constructeur qui demande le type
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Effectivement (je devais être dans le brouillard )
    Je peux donc écrire mes classes ainsi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Class Humain
        Inherits Personnage
        Public Sub New()
            MyBase.New(TypePersonnage.Humain)
        End Sub
    End Class
    Class Monstre
            Inherits Personnage
    Public Sub New()
            MyBase.New(TypePersonnage.Monstre)
        End Sub
    End Class
    merci
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  12. #12
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Avec un attribut (cela simplifie encore)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <Personnage(TypePersonnage.Humain)>
    Class Humain
        Inherits Personnage
    End Class
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/04/2019, 18h52
  2. [hibernate] Effacer un type d'objet
    Par nighma dans le forum Hibernate
    Réponses: 10
    Dernier message: 29/12/2005, 10h23
  3. Initialisation d'un type d'objet
    Par fdraven dans le forum Oracle
    Réponses: 3
    Dernier message: 28/10/2005, 11h05
  4. heritage et type
    Par suckthewindow dans le forum C++
    Réponses: 4
    Dernier message: 16/10/2005, 18h58
  5. [Appli] Recherche d'un type d'objet précis pour interface
    Par superpatate dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 05/08/2005, 12h02

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