web-dev-qa-db-fra.com

Pouvez-vous hériter d'un sous-nouveau (constructeur) avec des paramètres dans VB?

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

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

sur la Dim TestChild As ChildClass = New ChildClass("c"). Je ne le reçois pas sur TestChild.Method1() même s'ils sont tous les 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 d'autres méthodes héritées et je recherche le code le plus propre possible. Cela peut être une limitation dans le système avec l'héritage de nouvelles instructions paramétrées, mais je ne le trouve nulle part. Si cela est nécessaire, j'aimerais voir la documentation.

41
Bentley Davis

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

Vous devrez définir le même constructeur sur toutes les classes enfants et les chaîner explicitement dans le 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 de langage VB.

Je pense que la section la plus pertinente est la suivante (en gros 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 appelle 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 l'instruction.

57
JaredPar

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, puis appeler le constructeur du parent à l'aide de 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 VB spécifique. D'après ce que je peux comprendre, ce n'est définitivement pas possible en C #, Java ou C++ non plus).

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

8
Jose Basilio