2009-04-25 10 views
39

W kodzie poniżej otrzymuję błąd kompilacjiCzy możesz dziedziczyć sub-nowy (Constructor) z parametrami w VB?

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

na Dim TestChild As ChildClass = New ChildClass("c"). Nie dostaję go na TestChild.Method1(), mimo że oba należą do klasy bazowej, z której dziedziczę.

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 

mogę zmienić klasę dziecka do:

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

Jak sugeruje poniżej, ale nie mam do zrobienia, że ​​dla metody 1 lub innymi dziedzicznymi metod i szukam najczystszy kodu. Może to być ograniczenie w systemie z odziedziczeniem sparametryzowanych Nowych instrukcji, ale nie mogę znaleźć go nigdzie udokumentowanego. Jeśli jest to wymagane, chciałbym zobaczyć dokumentację.

Odpowiedz

51

Zachowanie że widzisz to "By Design". Klasy potomne nie dziedziczą konstruktorów z ich typów bazowych. Klasa potomna jest odpowiedzialna za definiowanie własnych konstruktorów. Dodatkowo musi zapewnić, że każdy konstruktor definiuje niejawnie lub jawnie wywołania do konstruktora klasy podstawowej lub do innego konstruktora w tym samym typie.

Będziesz musiał zdefiniować ten sam konstruktor na wszystkich klasach potomnych i jawnie połączyć się z powrotem do konstruktora bazowego za pomocą MyBase.New. Przykład

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

Dokumentacja, której szukasz, znajduje się w sekcji 9.3.1 specyfikacji języka VB.

Myślę, że najbardziej odpowiednia sekcja jest następujący (grubsza rozpoczęcia drugiej stronie)

Jeżeli typ nie zawiera deklaracji instancji konstruktora konstruktor domyślny jest automatycznie opatrzony. Domyślny konstruktor po prostu wywołuje konstruktor bez parametrów z bezpośrednim typem bazy.

Nie oznacza to wprost, że klasa potomna nie dziedziczy konstruktorów, ale jest to efekt uboczny instrukcji.

+1

JaredPar, Dzięki za jasną odpowiedź i wskazanie dokumentacji. Lubię mieć źródło, abym mógł zagłębić się w szczegóły, jeśli to możliwe. –

+1

Dobre wyjaśnienie, ale zastanawiam się, dlaczego nie można tego zrobić. Byłoby łatwo na to pozwolić. –

+1

Link do dokumentacji po kliknięciu tworzy teraz stronę z tekstem "Dokumentacja techniczna wycofana z programu Visual Studio 2003". – JohnH

7

Sparametryzowane konstruktory nie mogą być dziedziczone w taki sam sposób jak metody instancji. Musisz zaimplementować konstruktor w klasie potomnej, a następnie wywołać konstruktor nadrzędny za pomocą 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 

To ograniczenie nie zależy od VB. Z tego, co mogę zebrać, to na pewno nie jest możliwe w C#, Java lub C++ albo.

Oto jeden powiązany post z tym samym pytanie o C++:
c-superclass-constructor-calling-rules

+0

Dziękuję za sugestię. Zaktualizowałem kod, tak jak sugerowałeś w visual studio i nadal otrzymuję ten sam błąd kompilacji. Zaktualizowałem także post, aby inni mogli zobaczyć Twoją propozycję. Jakieś inne pomysły? –

+0

Przepraszamy, błędnie przeczytałem Twój wpis. Celem jest dziedziczenie nowej metody, więc nie muszę powtarzać kodu we wszystkich moich klasach dla dzieci.W jaki sposób mogę uzyskać dostęp do nowej metody w klasie bazowej bez kodowania jej w klasie potomnej, zgodnie z sugestią. –

+0

Jose, ja zredagowałem dla jasności. Nie muszę wdrażać metody 1 w klasie potomnej. Czy istnieje wymóg implementacji konstruktorów w klasie potomnej. Nie można ich bezpośrednio odziedziczyć? –