2009-04-25 10 views
39

En el siguiente código recibo el error de compilación¿Puedes heredar un sub nuevo (Constructor) con parámetros en VB?

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

en el Dim TestChild As ChildClass = New ChildClass("c"). No lo recibo en TestChild.Method1() a pesar de que ambos están en la clase base de la que estoy heredando.

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 

que podría cambiar la clase de niño a:

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

Como se sugiere a continuación, pero no tengo que hacer eso por el método 1 o otros métodos heredados y yo estoy buscando el código más limpio posible. Esto puede ser una limitación en el sistema heredando nuevas sentencias parametrizadas, pero no puedo encontrarla documentada en ninguna parte. Si es necesario, me gustaría ver la documentación.

Respuesta

51

El comportamiento que se está viendo es "por diseño". Las clases secundarias no incluyen constructores inherti de sus tipos básicos. Una clase infantil es responsable de definir sus propios constructores. Además, debe asegurarse de que cada constructor que define llama implícita o explícitamente a un constructor de clase base o cadenas a otro constructor del mismo tipo.

Deberá definir el mismo constructor en todas las clases secundarias y volver a encadenar explícitamente en el constructor base a través de MyBase.New. Ejemplo

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

La documentación que está buscando es la sección 9.3.1 de la especificación del lenguaje VB.

creo que la parte más relevante es la siguiente (aproximadamente el inicio de la segunda página)

Si un tipo no contiene declaraciones ejemplo constructor, un constructor por defecto es automáticamente previsto. El constructor predeterminado simplemente invoca el constructor sin parámetros del tipo base directo.

Esto no establece explícitamente que una clase secundaria no heredará constructores, sino que es un efecto secundario de la instrucción.

+1

JaredPar, gracias por la respuesta clara y señalando a la documentación. Me gusta tener la fuente para poder profundizar en los detalles cuando sea posible. –

+1

Buena explicación, pero me pregunto por qué no se puede hacer. Sería simple permitirlo. –

+1

El enlace de documentación al hacer clic ahora produce una página con el texto de "Documentación técnica retirada de Visual Studio 2003". – JohnH

7

Los constructores parametrizados no se pueden heredar de la misma forma que los métodos de instancia. Necesitas implementar el constructor en la clase hija y luego llamar al constructor padre usando 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 

Esta limitación no es específica de VB. Por lo que puedo deducir, definitivamente tampoco es posible en C#, Java o C++.

He aquí una entrada relacionada con la misma pregunta sobre C++:
c-superclass-constructor-calling-rules

+0

Gracias por la sugerencia. Actualicé el código como sugirió en Visual Studio y todavía recibo el mismo error de compilación. También actualicé la publicación para que otros puedan ver su sugerencia incorporada. ¿Alguna otra idea? –

+0

Lo siento, leí mal tu publicación. El objetivo es heredar el nuevo método para que no tenga que repetir el código en todas mis clases secundarias.¿Cómo puedo acceder al nuevo método en la clase base sin codificarlo en la clase secundaria como sugirió? –

+0

José, he editado para mayor claridad. No necesito implementar el método 1 en la clase hija. ¿Existe un requisito para implementar constructores en la clase secundaria? No pueden ser heredados directamente? –

Cuestiones relacionadas