none
Détecter le type d'objet retourné RRS feed

  • Discussion générale

  • Bonjour

    J'ai le code ci-dessous avec une Classe Base Toponyme et deux classes dérivées ToponymeFR et ToponymeBE
    Une fonction Detecter me permet de renvoyer la bonne classe dérivée.
    1) J'utilise dans Detecter un Return Objet ce qui ne me plait guère mais ai-je le choix?
    2) ToponymeFr et ToponymeBe ont des propriétés différentes CodeINSEE et CodeINS auxquels je n'ai pas accès dans mon Main. J'ai essayé de trouver une fonction ObjectType me permettant d'orienter le traitement en fonction de l'objet retourné par Detecter, mais sans succès.
    Merci pour votre aide.
    Bernard

    Module Module1
     
        Sub Main()
            Dim def As New List(Of String)
            def.Add("France")
            def.Add("Belgique")
            For Each d As String In def
                Dim o As Object
                o = Detecter(d)
                Console.WriteLine("Objet =" & o.ToString)
                Console.WriteLine("Nom =" & o.nom)
                Select Case objectType '???????????
                    Case ToponymeFr
                        Console.WriteLine("CodeINSEE=" & o.CodeINSEE)  '???????????
                    Case ToponymeBe
                        Console.WriteLine("CodeINS=" & o.CodeINS) '???????????
                End Select
     
            Next
            Console.ReadLine()
        End Sub
        Function Detecter(def As String) As Object
            Select Case def
                Case "France"
                    Dim topo As New ToponymeFr
                    Return topo
                Case "Belgique"
                    Dim topo As New ToponymeBe
                    Return topo
                Case Else
                    Return Nothing
            End Select
        End Function
     
        Public Class Toponyme
            Property Def As String
            Property Nom As String
            Property Code As String
            Public Sub New(d As String)
                Def = d
            End Sub
            Public Sub New()
     
            End Sub
        End Class
     
        Public Class ToponymeFr
            Inherits Toponyme
            Property CodeINSEE As String
            Public Sub New(d As String)
                MyBase.New(d)
                Nom = "France"
                Code = "Fr"
                CodeINSEE = d
            End Sub
            Public Sub New()
                Nom = "France"
                Code = "Fr"
            End Sub
     
        End Class
     
        Public Class ToponymeBe
            Inherits Toponyme
            Property CodeINS As String
            Public Sub New(d As String)
                MyBase.New(d)
                Nom = "Belgique"
                Code = "Be"
                CodeINS = d
            End Sub
            Public Sub New()
                Nom = "Belgique"
                Code = "Be"
            End Sub
        End Class
    End Module


    Bernard Bouree

    mercredi 21 juin 2017 13:53

Toutes les réponses

  • Bonjour Bernard,

    J'ai une proposition.

    Si je me souviens bien, dans ce post : https://social.msdn.microsoft.com/Forums/fr-FR/375d584d-7ec5-4345-9866-8bf5e335a4bd/problme-dinterface?forum=vbasicfr

    Nous avons créé une liste d'objets différents. Pourquoi ne pas utiliser la même logique?

    Au lieu que votre fonction Detecter renvoie un Objet, pourquoi ne pas renvoyer une liste d'objets différents qui implémentent la même interface vu que cela ne vous plait pas d'envoyer un objet?

    La fonction Detecter deviendrait donc : 

    Public Function Detecter(def As String) As List(Of Toponyme)
    
    	Dim lstToponymes As List(Of Toponyme) = New List(Of Toponym)()
    
    	Select Case def
    		Case "France"
    			lstTopnymes.Add(New Topnymefr())
    			Return lstToponymes
    		Case "Belgique"
    			lstTopnymes.Add(New ToponymeBe())
    			Return lstToponymes
    		Case Else
    			Return Nothing
    	End Select
    End Function

    Il faudra donc revoir votre Foreach

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;

    jeudi 22 juin 2017 09:12
  • Bonjour Nordine

    Merci pour votre proposition mais elle ne correspond pas à ma demande.

    En effet mon programme lit un fichier texte dans lequel certaines lignes contiennent des définitions de lieux (toponymes)

    A la lecture de ces lignes je détecte le pays concerné en identifiant un champs spécifique.

    Une fois identifier le pays je dois effectuer des traitements différenciés selon le pays.

    Ainsi les toponymes France, Belgique, etc. ont des propriétés et des méthodes communes définis dans la classe de base Toponyme et des propriétés et méthodes spécifiques dans ToponymeFR, ToponymeBe, etc.

    donc mon besoin est:

    - lecture d'une ligne et détecter le pays concerné

    - instancier le toponyme correspondant au pays concerné

    - appliquer les methodes et propriés du toponyme correspondant.

    soit

    Function Detecter ( pays as string) as ??

    Select Case pays

    Case "France"

    dim Topo as New ToponymeFR

    Return Topo

    etc.....

    Merci pour votre aide

    Bernard


    Bernard Bouree

    jeudi 22 juin 2017 10:00