Basics beim überschreiben/erweitern einer vorhandenen Klasse

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Bagplatt.

    Basics beim überschreiben/erweitern einer vorhandenen Klasse

    Hallo zusammen,

    Könntet ihr mir vielleicht ein paar Anregungen geben zu folgendem :

    Ich erstelle eine neue Instanz von z.B. einem UDP Client und Verbinde ihn direkt mit einem Server.
    Dieser besitzt keine Events, wenn der Status von Disconnect zu Connect wechselt.
    Dieses und weiteres würde ich gern nachträglich dazufügen und erweitern.

    Wie sollte ich vorgehen?

    Meine [Denkansätze]
    1. Neue Klasse
    2. Inherits UDPClient
    3. Property Connect einfügen
    4. Event einfügen
    5. Wenn Property gesetzt wird Event auslösen
    6. Diese Klasse wie UDPClient verwenden.

    Wie kann ich jetzt dass Property der Klasse UDP in meines Holen und ein Event Raisen?

    support.microsoft.com/de-de/kb/307222 Dass geht denk ich mal in die Richtung.

    LG

    #Edit

    Hab mir dass alles jetzt mal genauer angeschaut, wenn in der Klasse die ich erbe, dass Property nicht als Overridable gilt, kann ich sie ja gar nicht überschreiben. Ist dass so richtig?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bagplatt“ ()

    @Bagplatt Meinst Du NotInheritable Class?
    Da kannst Du eine Wrapper-Klasse drum herum bauen.
    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!
    @RodFromGermany

    Ich will die Klasse UdpClient um ein Event bereichern. Dieses soll ausgelöst werden wenn der Status vom Property "Connect" sich ändert.

    LG

    #Edit
    Was meinst du mit WrapperKlasse ?
    Mir ist dass nur ein Begriff in der Beziehung von win32 Dll die in einer .Net DLL importiert werden, und die Funktionen so "leichter" zur Verfügung stellt.

    Bagplatt schrieb:

    Begriff in der Beziehung von win32 Dll die in einer .Net DLL importiert
    Genau das.
    Nur importierst Du keine DLL, sondern eine nicht ableitbare Klasse.
    Erstell in dieser Wrapperklasse eine Instanz der nicht ableitbaren Klasse und führe alle Methoden und Properties nach außen.
    Wirf ein Event, wenn es geht und wenn es erforderlich ist.
    Feddich. :D
    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!
    Muss gestehen dass ich dass ableiten der Klassen so noch nie gebraucht habe.

    Da hab ich mal ein paar Fragen dazu :

    Woher weis ich dass die .Net Klasse nicht ableitbar ist.

    VB.NET-Quellcode

    1. Public Class Connection
    2. Inherits UdpClient
    3. Public Event Status(ByVal State As Boolean)
    4. Public Sub New()
    5. MyBase.New()
    6. End Sub
    7. Public Shadows Sub Connect(ByVal IP As IPEndPoint)
    8. MyBase.Connect(IP) '<- Verbinden
    9. RaiseEvent Status(MyBase.Client.Connected) '<- Wird erst ausgelöst wenn Verbinden fertig ist ?
    10. End Sub
    11. Public Shadows ReadOnly Property GetStatus() As Boolean
    12. Get
    13. Return MyBase.Client.Connected
    14. End Get
    15. End Property
    16. End Class


    Ich stehe gerade auf dem Schlauf.
    Dass eigentliche Property befindet sich ja in der vererbten klasse.
    Wenn ich den UDPclient starte, verändert sich ja nicht in meiner eigentliche Klasse der Status sondern in der Vererbten. bzw, dass Property wo ich da gerade angeschrieben hab wird ja gar nicht angesprochen oder?
    So bring dass auch nix wenn ich dort ein Event raise.

    @RodFromGermany Hast du vielleicht eine Dokumentation zu dem wrappen?

    LG

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Bagplatt“ ()

    Bagplatt schrieb:

    Woher weis ich dass die .Net Klasse nicht ableitbar ist
    Wenn die abzuleitende Klasse NotInheritable (VB.NET) bzw. sealed (C#) ist, kommt ein entsprechender Compilerfehler.
    MyBase.Connect(IP) - dazu solltest Du die Dokumentation lesen und ein paar Experimente durchführen, dann weißt Du, wie das funktioniert.
    =====
    Das Wrappen ist einfach eine Fleißarbeit, Du musst um jede Property und jede Prozedur, die Du benötigst, einen eigenen Rahmen schreiben:

    VB.NET-Quellcode

    1. Private MySpecialClass As DIE_NICHT_ABLEITBARE_KLASSE
    2. Public Sub New()
    3. MySpecialClass = New DIE_NICHT_ABLEITBARE_KLASSE()
    4. End Sub
    5. Public Function Init(Param As WhatEver) As Boolean
    6. Dim result = MySpecialClass.Init(Param)
    7. ' ggf. etwas tun
    8. Return result
    9. End Sub

    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!
    Hey,

    Ja, dass leuchtet mir ja alles ein. Aber da der UdpClient ja ableitbar ist, muss ich ja nicht sämtliche Methoden umschreiben.

    Wenn ich jedoch den Udp Client verbinde, ändert sich dass Property ja nicht direkt, sondern erst wenn er verbunden/abgebrochen hat.

    VB.NET-Quellcode

    1. Public Shadows Sub Connect(ByVal IP As IPEndPoint)
    2. MyBase.Connect(IP) '<- Verbinden
    3. RaiseEvent Status(MyBase.Client.Connected) '<- Wird erst ausgelöst wenn Verbinden fertig ist ?
    4. End Sub


    Wird dass Event, in dem Fall der Status, erst ausgelöst wenn die Base mit ihrem Verbindungsversuch durch ist?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bagplatt“ ()

    Bagplatt schrieb:

    Wird dass Event, in dem Fall der Status, erst ausgelöst wenn ...
    Weiß ich nicht.
    Lies mal in Post #6 nach:
    dazu solltest Du die Dokumentation lesen und ein paar Experimente durchführen, dann weißt Du, wie das funktioniert.
    Du musst Dir angewöhnen, solch Elementarprobleme in einem kleinen separaten Programm auszuprobieren.
    Bestenfalls eine andere Version von Framework / Betriebssystem / Fremdinstallation würden das Ergebnis beeinflussen, das ist jedoch eher unwahrscheinlich.
    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!

    RodFromGermany schrieb:

    in einem kleinen separaten Programm auszuprobieren


    Ja ^^ Da bei einem Verbindungsversuch zu einer nicht vorhandenen Adresse dass Programm stockt, und erst danach dass Event ausgelöst wird, passt dass auch.

    Dass Wrappen ist wirklich viel Tipparbeit, der UdpClient besitzt ja auch noch eine Client unterklasse^^

    Danke und LG :thumbsup: