43 votes

Peut-on hériter d'un sous nouveau (Constructeur) avec des paramètres en VB ?

Dans le code ci-dessous, je reçois l'erreur de compilation

Error Too many arguments to 'Public Sub New()'

sur le Dim TestChild As ChildClass = New ChildClass("c") . Je ne le reçois pas le TestChild.Method1() même s'ils sont tous deux sur la classe de base dont j'hérite.

Public Class BaseClass
    Public ReadOnly Text As String
    Public Sub New(ByVal SetText As String)
        Text = SetText
    End Sub
    Public Sub New()
        Text = ""
    End Sub
End Class

Public Class ChildClass
    Inherits BaseClass
End Class

Public Class TestClass
    Sub Test()
        Dim TestChild As ChildClass = New ChildClass("c")
        TestChild.Method1()
    End Sub
End Class

Je pourrais changer la classe enfant en :

Public Class ChildClass
    Inherits BaseClass
      Public Sub New (ByVal SetText As String)
      MyBase.New(SetText)
    End Class
End Class

Comme suggéré ci-dessous, mais je n'ai pas à le faire pour la méthode 1 ou les autres méthodes héritées et je cherche le code le plus propre possible. Il s'agit peut-être d'une limitation du système en ce qui concerne l'héritage des déclarations New paramétrées, mais je ne trouve aucune documentation à ce sujet. Si cela est nécessaire, j'aimerais voir la documentation.

59voto

JaredPar Points 333733

Le comportement que vous observez est "By Design". Les classes enfant n'héritent pas des constructeurs de leurs types de base. Une classe enfant est responsable de la définition de ses propres constructeurs. De plus, elle doit s'assurer que chaque constructeur qu'elle définit appelle implicitement ou explicitement un constructeur de la classe de base ou s'enchaîne à un autre constructeur du même type.

Vous devrez définir le même constructeur sur toutes les classes enfant et le relier explicitement au constructeur de base via MyBase.New. Exemple

Class ChildClass
  Inherits BaseClass
  Public Sub New(text As String)
    MyBase.New(text)
  End Sub
End Class

La documentation que vous recherchez est la section 9.3.1 de la spécification du langage VB.

Je pense que la section la plus pertinente est la suivante (en gros le début de la deuxième page)

Si un type ne contient aucune déclaration de constructeur d'instance, un constructeur par défaut est automatiquement fourni. Le constructeur par défaut invoque simplement le constructeur sans paramètre du type de base direct.

Cela n'indique pas explicitement qu'une classe enfant n'héritera pas des constructeurs, mais c'est un effet secondaire de la déclaration.

1 votes

JaredPar, Merci pour cette réponse claire et pour avoir indiqué la documentation. J'aime avoir la source pour pouvoir me plonger dans les détails quand c'est possible.

1 votes

Bonne explication mais je me demande pourquoi cela ne peut pas être fait. Il serait simple de l'autoriser.

2 votes

Le lien vers la documentation, lorsqu'il est cliqué, produit maintenant une page avec le texte "Visual Studio 2003 Retired Technical documentation".

8voto

Jose Basilio Points 29215

Les constructeurs paramétrés ne peuvent pas être hérités de la même manière que les méthodes d'instance. Vous devez implémenter le constructeur dans la classe enfant et ensuite appeler le constructeur du parent en utilisant MyBase.

Public Class ChildClass
    Inherits BaseClass

    Public Sub New (ByVal SetText As String)
      MyBase.New(SetText)
    End Class
End Class

Public Class TestClass
  Public TestChild AS New ChildClass("c")
End Class

Cette limitation n'est pas spécifique à VB. D'après ce que je sais, elle n'est certainement pas possible en C#, Java ou C++ non plus.

Voici un post connexe avec la même question sur le C++ :
c-superclass-constructor-calling-rules

0 votes

Merci pour cette suggestion. J'ai mis à jour le code comme vous l'avez suggéré dans Visual Studio et je reçois toujours la même erreur de compilation. J'ai également mis à jour le post afin que d'autres personnes puissent voir votre suggestion incorporée. D'autres idées ?

0 votes

Désolé, j'ai mal lu votre message. Le but est d'hériter de la nouvelle méthode pour ne pas avoir à répéter le code dans toutes mes classes enfant. Comment puis-je accéder à la nouvelle méthode dans la classe de base sans la coder dans la classe enfant comme vous l'avez suggéré.

0 votes

José, je l'ai modifié pour plus de clarté. Je n'ai pas besoin d'implémenter la méthode 1 dans la classe enfant. Y a-t-il une obligation d'implémenter les constructeurs dans la classe enfant. Ils ne peuvent pas être hérités directement ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X