Problem mit Ableitung von Konstruktoren

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ManOfShei.

    Problem mit Ableitung von Konstruktoren

    Erst einmal hallo an alle Forenmitglieder ... ich bin der neue und komme demnächst wahrscheinlich öfter. :D

    Ich habe die folgenden zwei Klassen (inhaltlich):

    VB.NET-Quellcode

    1. Public MustInherit Class AbstrakteKlasse
    2. ...
    3. Protected MustOverride Sub TueWas(ByVal DateiName As String)
    4. Friend Sub New(ByVal DateiName As String)
    5. ...
    6. TueWas(DateiName)
    7. ...
    8. End Sub
    9. End Class

    und

    VB.NET-Quellcode

    1. Public Class AbgeleiteteKlasse
    2. Inherits AbstrakteKlasse
    3. ...
    4. Protected Overrides Sub TueWas(ByVal DateiName As String)
    5. ...
    6. End Sub
    7. End Class

    Nun habe ich in meiner Naivität geglaubt ich könnte "AbgeleiteteKlasse" wie folgt instanzieren

    VB.NET-Quellcode

    1. Dim Klasse As AbgeleiteteKlasse = New AbgeleiteteKlasse("test.dat")

    Doch wenn ich das so versuche bekomme ich im Compiler folgende zwei Fehlermeldung:

    Quellcode

    1. Die Klasse "WindowsApplication1.AbgeleiteteKlasse" muss eine "Sub New" deklarieren, da ihre Basisklasse "WindowsApplication1.AbstrakteKlasse" keinen zugreifbaren "Sub New" hat, der ohne Argumente aufgerufen werden kann.

    und

    Quellcode

    1. Zu viele Argumente für "Public Sub New()".


    Was mich verwirrt ist, wozu braucht VB.NET an dieser Stelle einen Konstruktor (also "New") ohne Argumente? Ich will die Klasse nicht serialisieren und das Argument ist zwingend, da ansonsten die Klasse keinen Sinn macht.

    1. Gibt es eine Möglichkeit das "New" zu vererben, was er nämlich auch nicht macht, selbst wenn ich testweise ein totes "New" einbaue?
    2. Kann ich VB.NET irgendwie beibringen, dass er mir doch bitte überlassen soll, wie ich meine Konstruktoren aufbaue, da er die Klasse ja nie automatisch instanzieren muss?

    Ich wäre für ein/oder auch mehrere Tipp(s) sehr dankbar, da inzwischen so einige Gehirnwindungen schon dran glauben mussten. :cursing:

    MfG
    MoS :)

    P.S.: Ich habe auch schon google bemüht, aber selbst nach zwei Stunden leider nichts passendes dazu finden können. Es gibt zwar viel zum Thema Vererbung und Konstruktoren, aber leider habe ich nichts gefunden, das die Vererbung von Konstruktoren in VB.NET und somit mein Problem etwas näher beleuchtet.

    Das es nicht unmöglich ist, kenne ich aus Delphi, wo ich öfter ähnliche Konstrukte hatte, bei denen der Konstruktor in der abgeleiteten Klasse nicht überschrieben wurde, sondern nur in der abstrakten Klasse um z.B. Argumente festzulegen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ManOfShei“ ()

    Lesen müsste man können:

    VB.NET-Quellcode

    1. Public Class AbstrakteKlasse
    2. Protected Sub New() ' einen separaten parameterlosen Konstruktor einfügen
    3. End Sub
    4. Protected Sub New(ByVal FileName As String)
    5. End Sub
    6. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die schnelle Antwort, aber genau das ist ja mein Problem. Zwar könnte ich einen parameterlosen Konstruktor bauen, aber der würde zu einem inkonsistenten Objekt führen. Daher möcht ich das ja gerne umgehen, da ich eben auch nicht verstehe, wozu VB.NET den haben will. ;)

    Außerdem verstehe ich nicht, warum er den Konstruktor "New" aus der abstrakten Klasse in der abgeleiteten Klasse nicht mehr anbietet.

    ManOfShei schrieb:

    aber der würde zu einem inkonsistenten Objekt führen.
    Wieso?
    Bringe die Klassen erst mal zum Laufen und überlege dann, was inkonsistent ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Okay, ich hab mich offensichtlich missverständlich ausgedrückt, daher hier noch einmal eine etwas detailiertere Beschreibung der Situation:

    1. Beide Klassen sind als Modelle zu verstehen, da ich hier jetzt keine 150 Zeilen Code posten wollte.
    2. Die "AbstrakteKlasse" stellt einige Methoden zur Verfügung, die so in den abgeleiteten Klassen ("AbgeleiteteKlasse") nicht jedesmal erneut implementiert werden müssen, z.B. Hash-Prüfungen u.ä.
    3. Diese Methoden werden ihrerseits verwendet um Code aus einer XML-Datei einzulesen und entsprechend in eine Liste einzutragen, von wo aus sie anschließend über Eigenschaften abgerufen werden können. Das funktioniert auch soweit alles, da ich erst eine vollständige Einzelklasse entwicklet habe und dann daraus die abstrakte Basisklasse.
    4. Die Inkonsistenz bei einem parameterlosen "New" tritt nun dadurch auf, dass die Eigenschaften z.B. Strings oder Integer zurückgeben, die aber erste definiert sind, wenn auch eine XML-Datei gelesen wurde. Klar ich könnte jetzt "die Kuh ums Dorf tragen", indem ich eine Fehlerbehandlung zusätzliche schreibe oder beim parameterlosen "New" stanardmäßig mit "Exceptions werfe". Das kann doch aber nicht Sinn und Zweck der Sache sein. Zumal das zusätzlichen Code generiert. ;(

    P.S.: Ich Programmiere schon seit mehr als 10 Jahren OOP unter anderem mit Delphi und dort ist die oben beschriebene Form überhaupt kein Problem. Sowohl der fehlende leere Konstruktor, als auch die Vererbung des Konstruktors sind dort ohne weiteres möglich.

    P.P.S.: Alternativ wäre auch die Form "Public MustInherit Sub New(ByVal DateiName As String)" okay, die wird mir aber von VB.NET ebenfalls missbilligt, was allerdings auch eher verständlich ist. Wie bekomme ich dann aber einen Standardkonstruktor mit Parameter hin?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ManOfShei“ ()

    Hi!

    Das ist einfach so in .Net-Sprachen - fand ich auch anfangs komisch, dass Konstruktoren nicht vererbt werden, sondern jeder Erbe muß seine eigenen Konstruktoren implementieren. tut ja nicht soo weh:

    VB.NET-Quellcode

    1. Public Class AbgeleiteteKlasse : Inherits AbstrakteKlasse
    2. Friend Sub New(ByVal DateiName As String)
    3. MyBase.New(DateiName)
    4. End Sub
    5. Protected Overrides Sub TueWas(ByVal DateiName As String)
    6. ...
    7. End Sub
    8. End Class