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 :

Lire une classe héritée dans une classe de base [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 Lire une classe héritée dans une classe de base
    Bonsoir a tous,
    Je sollicite votre aide pour un petit problème que je n’arrive pas a résoudre.
    J'ai une classe DTOTache qui hérite de DTOBase comme 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
    23
    24
    25
    Public MustInherit Class DTOBase
     
        Public Sub New()
            Call Test()
        End Sub
     
        Private Sub Test()
            Dim attributs() As Object
            Dim att As DataInfoAttribute
            Dim propriété As System.Reflection.PropertyInfo
            Dim attType As Type = GetType(DataInfoAttribute)
            Dim classType As Type = GetType(DTOTache)
     
            For Each propriété In classType.GetProperties
                attributs = Attribute.GetCustomAttributes(propriété, attType)
                If attributs.Length > 0 Then
                    att = DirectCast(attributs(0), DataInfoAttribute)
     
                    Debug.WriteLine("Propriété = " & propriété.Name)
                    Debug.WriteLine("Field Name = " & att.FieldName)
                    Debug.WriteLine("Field Lenght = " & att.FiedLenght)
                End If
            Next
        End Sub
    End Class
    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
    Public Class DTOTache
        Inherits DTOBase
        Public Sub New()
     
        End Sub
        Public Sub New(row As DataRow)
     
        End Sub
     
     
        Private _IdTache As Integer
        <DataInfo("ID_TACHE")> _
        Public Property IdTache() As Integer
            Get
                Return _IdTache
            End Get
            Set(ByVal value As Integer)
                _IdTache = value
            End Set
        End Property
    End Class
    Dans DTOBase je fait référence a DTOtache sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Dim classType As Type = GetType(DTOTache)
    Hors DTOBase doit pouvoir hériter une autre classe que DTOTache, ma question est donc la suivante :
    Comment je peux faire pour que DTOBase fonctionne avec n'importe quel classe DTOxxx.

    Je vous remercie beaucoup de toute l'aide que vous pourrez m'apporter.

  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 lu tout le code mais je pense que tu dois juste remplacer

    par

    qui vaudra donc GetType(DTOTache) dans la classe DTOTache ou autre chose dans une autre


    le but de l'héritage étant justement de faire abstraction de ce qui va en hériter il ne faut surtout pas le nommer ...


    quand on a des choses spécifiques à coder on fait un membre MustOverride, et chaque héritier y met son code (rien n'empeche de faire des scénarios avec une sub sur la classe de base qui va pêcher des infos de fonctionnement sur une property mustoverride)
    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
    Merci Pol63, je pensez que 'Me' faisait référence a la Classe de base uniquement. C’était donc une erreur de ma part de penser cela.
    'Me' fonctionne donc parfaitement.
    Et merci beaucoup également pour les petits conseils .

  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
    me référence l'instance dans laquelle s'exécute le code, donc toujours l'héritage de plus haut niveau

    MyBase permet d'appeler des membres de niveau inférieur quand Me appellerait un membre de niveau n
    (quand on overrides un membre, par défaut vs écrit mybase.membre pour faire l'appel du code d'en dessous en plus du code qu'on va écrire, en supprimant cette ligne seul le code qu'on écrit sera exécuté)
    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
    Bonjour,

    En complément de ce que Pol63 a dit, et faire le tour du sujet.
    Il existe aussi Myclass.
    Myclass est employé pour faire référence à la classe elle même sans tenir compte des classes dérivées qui la surchargerons.
    mais MSDN-MyClass explique mieux que moi.
    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
    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 pour vos informations.
    J'espère que je n'abuse pas de votre patience mais j'ai un autre problème toujours avec cette même classe.
    Dans le code ou j'ai mis des "*************" il faudrait que je puisse accéder a la classe dérivée pour pouvoir assignér les propriétés de cette classe dérivée a partir de la classe de base.

    Quelque chose dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClassDérivée.Property1 = Value
    Nota : j'utilise la réflexion et les Attributs pour parcourir les propriétés et faire une sorte de mapping pour créer un objet a partir d'un Datarow.

    PS : Je n'ai pas encore traité le Cast de Value mais je le ferrais ensuite si cela fonctionne.

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Public MustInherit Class DTOBase
        Public Sub New()
     
        End Sub
        Public Sub New(ByVal row As DataRow)
            Call InitProperties(row)
        End Sub
     
        Private Sub InitProperties(ByVal row As DataRow)
            Dim attributs() As Object
            Dim att As DataInfoAttribute
            Dim propriété As System.Reflection.PropertyInfo
            Dim attType As Type = GetType(DataInfoAttribute)
            Dim classType As Type = Me.GetType
     
     
            For Each Col As DataColumn In row.Table.Columns
                Dim MatchField As Boolean = False
                Dim Value As Object = row(Col)
                Debug.WriteLine("Ordinal = " & Col.Ordinal.ToString & " - ColumnName = " & Col.ColumnName.ToString & " - Type = " & Col.DataType.ToString & " - Value = " & Value.ToString)
                For Each propriété In classType.GetProperties
                    attributs = Attribute.GetCustomAttributes(propriété, attType)
                    If attributs.Length > 0 Then
                        att = DirectCast(attributs(0), DataInfoAttribute)
                        If Col.ColumnName = att.FieldName Then
                            MatchField = True
                            'propriété.SetValue(classType, Value, Nothing)
                            'classType.GetProperty(propriété.Name)
     
                             ' **********************'
     
                            Debug.WriteLine("Propriété = " & propriété.Name)
                            Debug.WriteLine("Field Name = " & att.FieldName)
                            Debug.WriteLine("Field Lenght = " & att.FiedLenght)
                        End If
                    End If
                Next
                If MatchField = False Then
                    Throw New Exception("Error")
                    Exit Sub
                End If
            Next
        End Sub
    End Class
    Vous avez une idée ?

  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
    pas compris

    mais dans classType.GetProperties il y a les propriétés des classes dérivées contenues

    d'ailleurs je crois que cette méthode peut prendre des paramètres pour spécifier justement quelles sont les propriétés qu'on veut récupérer (public, private, dernier niveau de hierrachie etc...)

    sinon il y a les attributs qui sont pratique des fois, c'est ce qu'on mets au dessus d'un membre
    <tel attribut>

    on peut se créer ses propres attributs, et donc rechercher des propriétés qui l'ont


    quand tu auras fini tu pourras aussi réécrire tout ca avec des lamba expressions compilées, enfin si tu as le temps et que tu as besoin de performances

    ou sinon tu peux utiliser un ORM ca génère tout le code pour à partir d'une requete créer la classe avec les propriétés qui vont bien et les méthodes qui permettent de faire select/insert/update/delete sur les classes créées
    enfin si tu n'as pas besoin de performances (ca c'est plus pour le runing gag, ca doit être bien quand même)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    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
    Yesss, j'ai trouvé .
    Je suis impardonnable, je suis encore passé a coté de 'me' .
    (Mais c'est aussi parce que c'est la premeire fois que j'utilise la la reflexion et la méthode SetValue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    propriété.SetValue(Me, Value, Nothing)
    Je vous remercie vraiment beaucoup.

    EDIT : Merci pour ces infos Pol63 , je vais étudier tout ça.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  2. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  3. Changer un caractère dans une chaîne contenue dans une phrase
    Par cirtey dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/03/2007, 16h16
  4. Réponses: 4
    Dernier message: 16/05/2006, 23h15
  5. Réponses: 11
    Dernier message: 06/12/2005, 08h23

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