Klassen, Unterklassen Vererbung

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

Es gibt 120 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Moin moin

    Habe nochmal eine Frage zur Vererbung.

    Habe mir nun 3 Klassen erstellt und Frage mich ob diese nun so OK ist.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Kunden
    2. Dim _KdnNr As String
    3. Dim _Vorname As String
    4. Public Property KundenNr As String
    5. Set(value As String)
    6. _KdnNr = value
    7. End Set
    8. Get
    9. Return _KdnNr
    10. End Get
    11. End Property
    12. End Class


    VB.NET-Quellcode

    1. Public Class Adressen
    2. Inherits Kunden
    3. Dim _Ort As String
    4. Public Property Ort As String
    5. Set(value As String)
    6. _Ort = value
    7. End Set
    8. Get
    9. Return _Ort
    10. End Get
    11. End Property
    12. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Hallo

    Das mit dem "Dim" ist klar. Da kommen dann ja die Set & Get noch.
    Bei der Vererbung: Jeder Kunde hat ja Namen etc UND hat ja auch Adresse oder auch eine Bankverbindung oder oder... deswegen war so meine Überlegung mit dem "vererben".
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Wenn der Kunde die Adresse hat, dann gehörts aber nicht vererbt.

    Dann machst du so:

    VB.NET-Quellcode

    1. Public Class Kunde
    2. Property _Vorname as String
    3. Property _KundenNr as Integer
    4. Property _Adresse as Adresse
    5. End Class
    6. Public Class Adresse
    7. Property _Ort As String
    8. End Class


    VS schlägt dir bei dem Dim und der ganz simplen Get Set Property auch vor das so zu kürzen wie oben zu sehen. Weil diese kurzschreibweise genau das alles macht.
    Mein VS 2013 oder 2017 macht mir die lange Schreibweise wenn ich das eingebe was aber nicht schlimm ist. Ist eine Gute Übung für mich.
    Das mit den Klassen ist so besser stimmt. ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Klassen funktionieren aber...
    Habe hier mit dem Code ein Problem, das zwei Werte nicht in der DB gespeichert werden.
    Lasse mir die Werte zum Testen noch per MsgBox anzeigen, sind vorhanden aber in der DB nicht. Alles andere wird gespeichert.

    Spoiler anzeigen

    Das Form

    VB.NET-Quellcode

    1. Public Class Frm_AddKunde
    2. Dim Kdn As New Kunde
    3. Dim Adr As New Adresse
    4. Public Sub New()
    5. InitializeComponent()
    6. End Sub
    7. Private Sub Frm_AddKunde_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. Me.AdresseTableAdapter.Fill(Me.KundeAuftragDataSet.Adresse)
    9. Me.KundeTableAdapter.Fill(Me.KundeAuftragDataSet.Kunde)
    10. Me.Text = "Neukunde Anlegen"
    11. End Sub
    12. Private Sub Btn_NeuKunde_Click(sender As Object, e As EventArgs) Handles Btn_NeuKunde.Click
    13. Me.KundeBindingSource.AddNew()
    14. Me.AdresseBindingSource.AddNew()
    15. End Sub
    16. Private Sub Eingaben_prüfen()
    17. For Each TextBox As Control In GrBox_Addkunde.Controls
    18. TextBox.Text = TextBox.Text.Trim()
    19. Next
    20. Dim Textboxleer = False
    21. For Each TextBox In GrBox_Addkunde.Controls.OfType(Of TextBox)()
    22. If String.IsNullOrEmpty(TextBox.Text) Then Textboxleer = True : Exit For
    23. Next
    24. Dim RDButtonchecked = False
    25. For Each RDButton In GrBox_Addkunde.Controls.OfType(Of RadioButton)()
    26. If RDButton.Checked Then RDButtonchecked = True : Exit For
    27. Next
    28. If Textboxleer = True OrElse Not RDButtonchecked Then
    29. MessageBox.Show("Bitte alle Felder ausfüllen.")
    30. Else
    31. Kdn.KdnNrerzeugen(TexBox_Vorname.Text, TexBox_Nachname.Text)
    32. Lbl_KdnNr.Text = Kdn.KundenNr
    33. Adr.KundenID = CInt(IDTextBox.Text)
    34. SaveKunde()
    35. End If
    36. End Sub
    37. Private Sub SaveKunde()
    38. Try
    39. Me.Validate()
    40. ' In der MsgBox sind die Werte vorhanden...
    41. MessageBox.Show(Kdn.Geschlecht & Adr.KundenID)
    42. Me.KundeBindingSource.EndEdit()
    43. Me.AdresseBindingSource.EndEdit()
    44. Me.TableAdapterManager.UpdateAll(Me.KundeAuftragDataSet)
    45. Catch ex As Exception
    46. MessageBox.Show(ex.Message)
    47. End Try
    48. End Sub
    49. Private Sub Btn_saveKunde_Click(sender As Object, e As EventArgs) Handles Btn_saveKunde.Click
    50. Eingaben_prüfen()
    51. End Sub
    52. Private Sub RadBtn_female_CheckedChanged(sender As Object, e As EventArgs) Handles RadBtn_female.CheckedChanged, RadBtn_male.CheckedChanged, RadBtn_diveres.CheckedChanged
    53. If RadBtn_female.Checked Then
    54. Kdn.Geschlecht = "Frau"
    55. ElseIf RadBtn_male.Checked Then
    56. Kdn.Geschlecht = "Herr"
    57. ElseIf RadBtn_diveres.Checked Then
    58. Kdn.Geschlecht = "Diverse"
    59. End If
    60. End Sub
    61. End Class


    Die Klasse ( Hier im Forum die Klasse gekürzt!!)

    VB.NET-Quellcode

    1. Public Class Kunde
    2. Public SQLDatum As String = Date.Now.ToString("dd.MM.yyyy")
    3. Dim _KdnNr As String
    4. Dim _Vorname, _Nachname As String
    5. Dim _Email As String
    6. Dim _Telefon As Integer
    7. Dim _Geschlecht As String
    8. Property Adresse As Adresse
    9. Friend Function KdnNrerzeugen(ByVal vname As String, ByVal nname As String) As String
    10. Dim zufallzahl As New Random
    11. Dim kdnr = zufallzahl.[Next](1000, 100000)
    12. KundenNr = vname.Substring(0, 1) & nname.Substring(0, 1) & "-" & kdnr
    13. Return KundenNr
    14. End Function
    15. #Region "Propertys"
    16. Public Property Geschlecht As String
    17. Set(value As String)
    18. _Geschlecht = value
    19. End Set
    20. Get
    21. Return _Geschlecht
    22. End Get
    23. End Property
    24. End Class


    Klasse Adresse ( auch gekürzt )

    VB.NET-Quellcode

    1. Dim _KdnID As Integer
    2. Public Property KundenID As Integer
    3. Set(value As Integer)
    4. _KdnID = value
    5. End Set
    6. Get
    7. Return _KdnID
    8. End Get
    9. End Property

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Hm da kann ich nicht ganz folgen. Du ziehst ne Tabelle aus der DB fügst eine Zeile hinzu und Updatest dann
    Die Werte die du in der MessageBox anzeigst kommen aus den Klassen, versuch mal die Werte aus der zugehörigen Datenzeile da rein zu tun und schau ob die wirklich befüllt sind.

    Wenn die befüllt sind, dann musst du mal schauen nachdem du eine Zeile hinzufügst, ob das hier befüllt ist mit den hinzugefügten Zeilen Me.KundeAuftragDataSet.Kunde.GetChanges. Ich hatte damit mal Probleme, dass die Änderungen das DataSet garnicht mitgekriegt hat, dann wurde da auch nix geupdatet.

    Wenn da auch alles korrekt ist, dann liegt es am Update Befehl und da kann ich aber auch nicht mehr viel zu sagen. Ich hatte mal ähnliche Problem mit SqlDataAdapter ob sich das mit deinem Adapter jedoch genauso verhält weiß ich nicht. In diesem Thread in Post 13 von EDR finde ich aber eine zuverlässige Vorgehensweise für SqlDataAdapter.
    Die TableAdapter aus dem Designer sind aber was Anderes. Vielleicht können die mehr.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Hallo

    Bin eh gerade etwas verwirrt mit der Klasse und der Bindingsource.

    Habe mir ein Dataset gemacht. Daran sind nun Textboxen gebunden. Die Einträge aus den Textboxen werden auch ins DS bzw später in der Datenbank oder ins XML gespeichert.
    Wie bekomme ich aber nun die Verbindung zur Klasse hin?
    Ob ich das hier im Form mache oder nicht ist doch völlig egal:Kdn.Vorname = TexBox_Vorname.Text
    Die Daten werden gespeichert und beim auslesen auch wieder in die Textboxen geschrieben? WOFÜR habe ich dann die Arbeit mit der Klasse gemacht?
    An eine Bindingsource kann ich ja nur Textboxen etc binden aber keine "Variable" oder???
    So nach dem Motto: BindingSource ??? = Kdn.Vorname

    VB.NET-Quellcode

    1. Dim _Vorname As String
    2. Public Property Vorname As String
    3. Set(value As String)
    4. _Vorname = value
    5. End Set
    6. Get
    7. Return _Vorname
    8. End Get
    9. End Property
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    tDS (typisiertes DataSet), BindingSource (BS) und Controls (z.B. TextBox) sind vor allem dafür da, um im tDS die eigene Klasse anzulegen und dann mithilfe der BS an Deine Controls zu binden, damit automatisch bei Änderung der Daten die Gegenstelle aktualisiert wird. Wenn also die Klassendaten im tDS geändert werden (durch eigenen Code oder durch die die Datenquelle (DB, XML)), werden die Controls die neuen Daten anzeigen. Werden die Klassendaten in den Controls geändert werden (z.B. durch Benutzereingaben), werden die Daten automatisch im tDS aktualisiert. Das nennt sich (bidirektionales) DataBinding und ist dafür da, den Umgang mit Klassen und Datenspeicherung zu vereinfachen und den Aufwand beim Synchronisieren der Daten zwischen tDS/DB und GUI zu reduzieren.
    Dann brauchst Du schlussfolgerichtig auch keine eigenen Klassen zu schreiben. Der Umgang mit tDS führt aber auch dazu, dass Du Deine Ambitionen, Klassen, Vererbung und Komposition zu lernen, in den Wind schießen kannst. Vererbung ist beim tDS nicht möglich. Und Komposition ist so auch nicht möglich, weil Hat-Beziehungen über (vor allem ID-)Verweise erreicht werden.
    Es ist Deine Entscheidung, was Deine Prioritäten sind. Weil tDS effektiv nichts mehr mit diesem Threadthema zu tun hat. Wenn Du viel über tDS lernen willst: Schau mal bei EdRs VVV rein. Da gibt's genügend Infos zum schnellen Einstieg.
    Aber der richtige Umgang mit eigenen Klassen ist damit vom Tisch.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich dachte dass das zusammenspielt, Klassen und tDS.
    Also ich habe meine Klasse "Personen" mit all Ihren "Eigenschaften" angelegt usw...
    Wenn ich nun diese Klasse Personen gar nicht brauche dann ist das wieder so eine " Unlogik ".

    Für mich wäre es nun Logisch gewesen, das die Textbox die Daten an die Klasse übergibt ( meine Set und Get ) und die Klasse sendet dann an das tDS ... hmmmm ;(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Dann müsstest Du ja Deine Klassen doppelt modellieren (einmal im tDS-Designer, einmal zusätzlich in eigenen Dateien) und Du würdest den sehr guten DataBinding-Support verlieren. Also ich weiß ja nicht wie sinnvoll das ist, aber mal sehen, ob sich z.B. @ErfinderDesRades dazu äußern will. Falls er noch Lust hat und ihm das nicht (wie mir) alles zu fahrig wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    fahrig bedeutet ungezielt.
    Das macht es schwieriger gute Antworten zu schreiben.

    Wenn du eine List(Of Kunde) hast, dann ist das wie eine typisierte DataTable, deren Spalten die Eigenschaften von Kunde sind.
    Nur dass die DataTable ja noch die einfachen Möglichkeiten hat im Designer gestaltet und mit vielen anderen Elementen ganz leicht verknüpft werden zu können wie Datenbanken oder DGVs
    (wobei eine List(Of T) hab ich auch schon an ein dgv gebügelt)
    Mir ist es hier zu fahrig geworden, weil Du beim Thema Klassen und Vererbung angefangen hast. Nun bist Du bei tDS. Das ist ne ganz andere Baustelle.
    Auch ist es so, dass wir anscheinend nicht fertig werden. Wir sind inzwischen bei Post#114 und ich habe nicht das Gefühl, dass eine der hiesigen Erklärungen zum Thema Vererbung oder Komposition Dir irgendwie großartig weitergeholfen haben. Ich glaube daher, dass ich nicht in der Lage bin, Dir (zumindest bei diesem Thema) noch was Zielführendes schreiben zu können. Von daher muss ich mich wohl oder übel aus diesem Thread verabschieden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Moin moin
    ​Das ist ne ganz andere Baustelle.
    Das mag dir so erscheinen aber mir leider nicht. Habe versucht das mit den Klassen, den Property usw hinzubekommen. Dann wollte ich das in einem Beispiel mit Eingaben über ein Form in ein tDs umsetzen. HIER stellte ich nun fest, das ich, wenn ich so mit tDS arbeite, diese KLASSEN gar nicht so benötige; was mich dann wieder verwirrte. Sinn & Unsinn von OOP ,-)
    Ihr alten Hasen kennt euch aus, wisst Dinge die ich vielleicht erst in 2 oder 3 Jahren erlerne...was mir dann vielleicht das ganze OOP doch wieder Sinnvoller erscheinen lässt.

    Das manche Themen so lang werden, liegt auch manchmal daran, das dann eine Diskussion zwischen Euch alten Hasen aufkommt, was nun wichtig ist.
    Hier z.B. ob ich Public oder Friend usw verwenden soll/muss/darf Wichtig für mich war es den wichtigen Unterschied zu erkennen.
    Ebenso mit der Klassenvererbung. Wenn dann die Ansichten, ob z.B. andere Säugetiere als der Mensch auch eine "Sprache" haben, ewig diskutiert werden macht es alles nur noch länger.
    Ich habe durch mein AA eh schon Probleme einiges so schnell zu verstehen wie ihr "Normneuros", da ist dann so etwas nicht Hilfreich.
    Ebenso bringen mich Beispiele durcheinander welche dann fern ab von meinem sind; da muss ich erst lange umdenken usw. was für einen AA nicht leicht ist.
    Ich bin hier im Forum um etwas zu lernen, nicht um Irgendjemanden zu nerven oder sonstwas.
    Egal wer der Meinung ist mir nicht mehr helfen zu können, dann ist das so und ich akzeptiere das.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Sinn & Unsinn von OOP
    Nur weil Du die Klassen nicht selber programmierst, sondern diese durch den tDS-Designer erstellt werden, ist das trotzdem OOP. Da wird sogar sehr viel OOP angewandt - aber eben automatisch (der Code wird automatisch erstellt), ohne dass Du selber Dir darüber Gedanken machen musst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ​ ohne dass Du selber Dir darüber Gedanken machen musst

    Ja eben! Wenn ich nicht weiß, was da im Hintergrund alles automatisch erzeugt wird, werde ich es wohl nie richtig lernen / verstehen.
    Dann ist das so ( sorry für diese Wortwahl ) nur ein zusammen geklicke mit ein bissel Code drumrum schreiben. Es kommt dann im besten Falle ein kleines Programm heraus, was im groben das tut was ich mir vorstelle ABER warum das so und so funktioniert.. NULL Ahnung...

    So wie in meinem Beispiel:
    Ich habe eine Form mit einem Eingabeformular und alles wird in einer XML oder DB abgelegt. Die Arbeit mit meinen Klassen war umsonst ( außer der Lerneffekt )
    Das was da mit den tDS usw im Hintergrund passiert ... Null Ahnung aber wozu auch, es funktioniert ja.

    Aber wenn es nicht funktioniert was dann?
    Fehlersuche?
    Wo? Wie? Im Code den ich selber nicht geschrieben, geschweige verstehe...

    Ich möchte das jetzt hier aber nicht ausufern lassen.
    Danke
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Wenn Du den korrekten Klassenumgang lernen willst, lass das tDS weg.
    Wenn Du DataBinding willst, ohne Dich groß um Datenverschiebung oder Speicherung kümmern zu müssen, bleib beim tDS.
    Wenn Du zu Klassen und Vererbung Fragen hast, stelle sie so gezielt wie möglich.
    Wenn Du zu tDS Fragen hast oder nicht weiterkommst, stelle sie so gezielt wie möglich in einem neuen Thread.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Amelie

    Aus welchem Grund lernst Du das Programmieren mit VB.net? Ist das eine Umschulung/Weiterbildung oder nur zum Spaß.
    Wenn letzteres dann lass bei Deinen Übungsprojekten erstmal XML/Datenbank usw. weg und konzentriere Dich auf grundlegendes.
    Wenn das dann besser klappt kannst Du später immer noch XML/Datenbank hinzunehmen.

    Und lasse Dich nicht einschüchtern wenn andere mit Deiner Aussage "Sinn & Unsinn von OOP" nicht ganz klar kommen. :D
    Das geht mir heute oft noch so und ich programmiere seit 37 Jahren. ;)
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:

    Amelie schrieb:

    Wo? Wie? Im Code den ich selber nicht geschrieben, geschweige verstehe...

    Im automatischen Code sind keine Fehler (naja und wenn doch dann sagt MS das ist veraltet), den kannst du auch nicht verändern (höchstens selber was besseres bauen). Du wirst mit dem Lernen nicht übermorgen fertig sein, dass heißt Fehlersuche wird immer wieder ein Punkt sein, an dem man neue Sachen lernt.