2009-04-25 5 views
39

Dans le code ci-dessous je reçois l'erreur de compilationPouvez-vous hériter d'un sous-constructeur (nouveau) avec des paramètres dans VB?

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

sur le 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:

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 ne pas le faire pour la méthode 1 ou d'autres méthodes héritées et je suis à la recherche du code 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 peux pas le trouver documenté nulle part. Si c'est nécessaire, j'aimerais voir la documentation.

Répondre

51

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

Vous devrez définir le même constructeur sur toutes les classes enfants et renvoyer 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 partie la plus pertinente est la suivante (début à peu près de la deuxième page)

Si un type ne contient pas de déclarations de constructeur d'instance, un constructeur par défaut est automatiquement à condition de. Le constructeur par défaut appelle simplement le constructeur sans paramètre du type de base direct.

Ceci n'indique pas explicitement qu'une classe enfant n'héritera pas des constructeurs mais c'est un effet secondaire de l'instruction.

+1

JaredPar, Merci pour la réponse claire et en pointant vers la documentation. J'aime avoir la source pour pouvoir plonger dans les détails quand c'est possible. –

+1

Bonne explication mais je me demande pourquoi cela ne peut pas être fait. Ce serait simple de le permettre. –

+1

Le lien de la documentation lorsque vous cliquez dessus produit maintenant une page avec le texte de "Documentation technique Retired Visual Studio 2003". – JohnH

7

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 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 peux comprendre, ce n'est certainement pas possible en C#, Java ou C++ non plus.

Voici un poste lié à la même question sur C++:
c-superclass-constructor-calling-rules

+0

Nous vous remercions de votre 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 verront votre suggestion incorporée. D'autres idées? –

+0

Désolé, j'ai mal lu votre message. Le but est d'hériter de la nouvelle méthode, donc je n'ai pas besoin de répéter le code dans toutes mes classes enfants.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

Jose, j'ai édité pour plus de clarté. Je n'ai pas besoin d'implémenter la méthode 1 dans la classe enfant. Existe-t-il une exigence pour implémenter des constructeurs dans la classe enfant. Ils ne peuvent pas être hérités directement? –