none
Méthode avec une classe personnel comme paramètre RRS feed

  • Question

  • Bonjour à vous,

    Voici le problème auquel je suis exposé :

    Imaginons deux classe personnel "Voiture" et "Instrument"

    Public Class Voiture
    
    ' Ici le constructeur et les propriété..
    
    End Class
    
    Public Class Instrument
    
    ' Ici le constructeur et les propriété..
    
    End Class


    Et une méthode :

    Public Sub MaMéthode(ByVal MaClasse As INCONNU)
    Dim _Liste As New List(Of MaClasse)
    End Sub

    Ainsi, quand j'utiliserai ma méthode avec comme paramètre ma classe Voiture, j'obtiendrai une liste de voiture et de même pour Instrument où j'obtiendrai une liste d'instrument.

    Par quoi dois-je remplacer INCONNU pour qu'il puisse accepter un type (classe) ?

    Merci,

    mercredi 30 octobre 2013 22:44

Réponses

  • Troisième message :)

    J'ai réussie en rusant un peut, ce code n'est pas le même que le mien c'et juste pour donner une idée :

    Public Class
    	Public Shared Sub CreatListOf(ByVal Text As String)
    		Select Case Text
                    Case "Voiture"
                        Dim _List As New List(Of Voiture)
                    Case "Instrument"
                        Dim _List As New List(Of Instrument)
                    Case Else 'Else et non "Humain" pour éviter le surlignement Vert
                        Dim _List As New List(Of Humain)
                End Select
    	End Sub
    End Class

    • Marqué comme réponse Apyn AOM jeudi 31 octobre 2013 10:06
    jeudi 31 octobre 2013 10:05

Toutes les réponses

  • Après tout dépend ce que vous voulez en faire dans votre code.

    Si les classes Voiture et Instrument possèdent des propriétés/méthodes communes que vous utilisez dans MaMethode, dans ce cas, créer une interface :

    Public Interface IName
        Property Name() As String
    End Interface
    
    Public Class Voiture
        Implements IName
        Public Property Name() As String Implements IName.Name
    End Class
    
    Public Class Instrument
        Implements IName
    
        Public Property Name As String Implements IName.Name
    End Class

    Et donc la méthode devient :

        Public Sub MaMethode(ByVal maClasse As IName)
            Dim liste As New List(Of IName)
            '...
        End Sub

    NB : n'utilisez SURTOUT pas d'accent dans vos noms de variables, méthodes, classes, etc.

    Autre solution, l'utilisation de générique :

        Sub Main()
            Dim sName As String = "Richard"
            MaMethode(sName)
    
            Dim iAge As Int32 = 49
            MaMethode(iAge)
        End Sub
    
        Public Sub MaMethode(Of T)(ByVal maClasse As T)
            Dim liste As New List(Of T)
            '...
        End Sub


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    jeudi 31 octobre 2013 08:43
  • Il semblerai que créer un interface ne soit pas la bonne solution ;

    J'ai une bibliothèque de classe (contenant plusieurs classe, qui n'ont pas les même paramètres admettons : voiture, instrument...) : .dll

    Ensuite dans un programme (avec .dll en référence) je doit faire une liste, d'où la méthode.

    (Pour ce qui est de l'accent, c'est une erreur de ma part quand je vous est écrit le message :p)

    En revanche l'utilisation de "générique" doit pouvoir porter ses fruits, je le test et vous tient au courant ;)

    Cordialement

    jeudi 31 octobre 2013 09:30
  • Malheureusement cela ne marche pas :

    Quand j'appelle la méthode avec comme paramètre une des classes, celle-ci est souligné en rouge et le message est le suivant : 'MaClasse' est un type dans 'MonNamespace' et ne peut pas être utilisé en tant qu'expression.

    J'ai déjà essayé avec ByVal MaClasse As Object/Type/TypeOf mais le même message d'erreur revenait :/

    En faite je crois que le problème viens de mon code car j'ai essayé de mettre en paramètre de méthode une seul classe, comme ByVal MaClasse As Voiture et quand j'appelle la méthode et que je met Voiture ça me met le même message --'

    • Modifié Apyn AOM jeudi 31 octobre 2013 09:42
    jeudi 31 octobre 2013 09:36
  • Troisième message :)

    J'ai réussie en rusant un peut, ce code n'est pas le même que le mien c'et juste pour donner une idée :

    Public Class
    	Public Shared Sub CreatListOf(ByVal Text As String)
    		Select Case Text
                    Case "Voiture"
                        Dim _List As New List(Of Voiture)
                    Case "Instrument"
                        Dim _List As New List(Of Instrument)
                    Case Else 'Else et non "Humain" pour éviter le surlignement Vert
                        Dim _List As New List(Of Humain)
                End Select
    	End Sub
    End Class

    • Marqué comme réponse Apyn AOM jeudi 31 octobre 2013 10:06
    jeudi 31 octobre 2013 10:05
  • Désolé mais je pense que vous avez mal compris ma réponse avec les génériques.

    Quand j'écris :

    Public Sub MaMethode(Of T)(ByVal maClasse As T)
           
    Dim liste As New List(Of T)
           
    '...
    End Sub

    Vous devez écrire exactement la même chose dans votre code. T est marqué comme étant générique, donc non spécifié. Et donc je pense que ca correspond exactement à ce que vous cherchez.

    Faites attention avec un code avec un Select Case : difficilement maintenable.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    jeudi 31 octobre 2013 13:58