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.
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.
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