Partage
  • Partager sur Facebook
  • Partager sur Twitter

[POO & VB.NET] Problème de constructeur

Sujet résolu
    18 mars 2011 à 19:37:38

    Salut les zeros,

    Bon ce coup là c'est moi le zéro. :lol:
    Voici la situation. :(

    J'ai une classe qui s'appelle template, 3 sous classes qui en hérite (ou découle) que l'on va nommer A,B et C. Les constructeurs de A, B et C sont très différents.

    Je voudrais que l'utilisateur lorsqu'il crée un objet template, suivant les arguments qu'il va placer dans le constructeur, le programme choisisse automatiquement la bon constructeur dans une des sous classes.

    Je n'y parvient malheureusement pas. Et je sais pas si ça ce fait de surcharger le constructeur de la classe template.

    Je sais pas si je suis clair ...

    Je vous mets le code actuel:

    Public Class Templates
    
    End Class
    


    Public Class Clearance
        Inherits Templates
        Private _Distance As Double
        Sub New(ByVal Distance As Double)
            _Distance = Distance
        End Sub
        Public Property Distance() As Double
            Get
                Return _Distance
            End Get
            Set(ByVal value As Double)
                _Distance = value
            End Set
        End Property
    End Class
    


    Public Class Accessibility
        Inherits Templates
        Private _Point As Point3D
        Private _Distance As Double
        Sub New(ByVal Point As Point3D, ByVal _Distance As Double)
            _Point = New Point3D(Point.coordX, Point.coordY, Point.coordZ)
            _Distance = _Distance
        End Sub
        Public Property Point() As Point3D
            Get
                Return _Point
            End Get
            Set(ByVal value As Point3D)
                _Point = value
            End Set
        End Property
        Public Property Distance() As Double
            Get
                Return _Distance
            End Get
            Set(ByVal value As Double)
                _Distance = value
            End Set
        End Property
    End Class
    
    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2011 à 20:06:08

      Citation

      Je voudrais que l'utilisateur lorsqu'il crée un objet template, suivant les arguments qu'il va placer dans le constructeur, le programme choisisse automatiquement la bon constructeur dans une des sous classes.


      Un constructeur ne peut pas être utilisé pour faire ça. Tu dois prévoir une méthode statique (éventuellement 3 fois la même méthode avec des paramètres différents mais toujours un type de retour Template) qui créera une instance de la bonne classe en fonction des paramètres transmis.
      • Partager sur Facebook
      • Partager sur Twitter
        18 mars 2011 à 21:26:50

        Okay, Voila ce que ça donne.

        Public Class Templates
            Public Shared Function Create(ByVal _Point As Point3D, ByVal _Distance As Double, Optional ByVal _Orientation As Direction = Nothing) As Templates
                Dim value As Compliance
                value = New Compliance(_Point, _Distance, _Orientation)
                Return value
            End Function
            Public Shared Function Create(ByVal _Point As Point3D, ByVal _Distance As Double) As Templates
                Dim value As Accessibility
                value = New Accessibility(_Point, _Distance)
                Return value
            End Function
            Public Shared Function Create(ByVal _Distance As Double) As Templates
                Dim value As Clearance
                value = New Clearance(_Distance)
                Return value
            End Function
        End Class
        


        Bon par contre il veut pas surcharger avec la seconde car d'après VB, on ne peut pas surcharger une méthode avec les mêmes paramètres ou l'unique différence entre les deux et le paramètre optionnel.
        J'ai du mal a comprendre...

        Merci.
        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2011 à 21:57:05

          Citation : Watanen

          Bon par contre il veut pas surcharger avec la seconde car d'après VB, on ne peut pas surcharger une méthode avec les mêmes paramètres ou l'unique différence entre les deux et le paramètre optionnel.


          C'est assez logique : il faut que le compilateur soit capable de comprendre quelle fonction tu veux appeler. Si tu veux pouvoir différencier ces deux méthodes, retire la valeur par défaut.

          Cela dit, il y a quand même un gros problème de conception... :o Les constructeurs de tes 3 classes sont loin d'être "très différents". Du coup leurs paramètres ne suffisent pas toujours à identifier le type d'objet que tu veux instancier. A ce moment-là autant instancier directement l'objet voulu plutôt que de passer par une méthode qui pourrait (on ne sait pas trop comment) faire ce travail...
          • Partager sur Facebook
          • Partager sur Twitter
            18 mars 2011 à 22:39:09

            Si le choix ce fait sur le nombre de parametre, tu pourrais fait un constructeur pour Template avec params?

            class Template
                {
                    public Template(params Object[] listParam)
                    {
                        if (listParam.Length == 1)
                        {
                            //cast puis creer L'objet voulu
                        }
                        else if (listParam.Length == 2)
                        {
                            //idem et ainsi de suite
                        }
                    }
                }
            


            Ca complique pas mal, mais ca ferait ce que tu veux non?
            • Partager sur Facebook
            • Partager sur Twitter
              21 mars 2011 à 16:36:20

              @Orwell

              Au sujet du problème de conception, c'est que je tente d'être le plus proche possible du modèle réel de gabarit (issue d'une problématique de génie mécanique). Si j'ai de plus en plus de difficulté je modifierais la conception.

              Merci à toi.

              @Cindoum

              J'ai utilisé ta réponse, qui était vraiment pas mal et qui donne en effet ce que je voulais. :D

              Public Class Templates
                  Public Function Template(ByVal Distance As Double, Optional ByVal Point As Point3D = Nothing, Optional ByVal Orientation As Direction = Nothing) As Templates
              
                      Dim listParam As New List(Of Object)
                      Dim ClassBack As Templates
              
                      listParam.Add(Distance)
                      If NullReferenceException.ReferenceEquals(Point, Nothing) = False Then
                          listParam.Add(Point)
                      End If
                      If NullReferenceException.ReferenceEquals(Orientation, Nothing) = False Then
                          listParam.Add(Orientation)
                      End If
              
                      Console.WriteLine(Distance)
                      If (listParam.Count = 1) Then
                          ClassBack = New Clearance(Distance)
                          Return ClassBack
                      ElseIf (listParam.Count = 2) Then
                          ClassBack = New Accessibility(Point, Distance)
                          Return ClassBack
                      ElseIf (listParam.Count = 3) Then
                          ClassBack = New Compliance(Point, Distance, Orientation)
                          Return ClassBack
                      Else
                          Return Nothing
                      End If
              
                  End Function
              End Class
              


              Merci à toi.

              Bonne journée à tous les deux. :)
              • Partager sur Facebook
              • Partager sur Twitter

              [POO & VB.NET] Problème de constructeur

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown