OOP-Anfängerfragen

  • Allgemein

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    OOP-Anfängerfragen

    Mahlzeit,

    bevor zu Tisch geht habe ich noch ein paar Fragen zum Thema OOP.
    Mein Niveau: Anfänger (seit zwei Wochen habe ich den Anfänger quatsch hinter mir, sonst PHP und SQL mäßig bisher unterwegs gewesen)

    Also nachdem ich nun die ganzen Anfänger Tuts durch habe und das Ziel meiner ersten richtigen Anwendung verfolge, stoße ich nun an den Punkt objektorientierte Programmierung. Es gibt je die ganzen Standard-Klassen von .NET, aber wenn ich hiervon ein Objekt erstelle, kann das ja nicht alles an der objektorientierten Programmierung sein. In der Literatur warten dort mehrere hunderte von Seiten auf mich und das ganze ist sehr trocken und theoretisch gehalten. Nun mal an meinem praktischen Beispiel meiner Kassen-Anwendung. Diese besteht aus Hauptanwendung (Kasse), Verwaltung (Artikel). Wie kommt nun die Objektorientierung ins Spiel?! Also lege ich eine Klasse Musterartikel am woraus später die Objekt Artikel bestehen? Und kommt dann in die Klasse Musterartikel die ganzen Eigenschaften von Artikel (die ja eigentlich als Spalten in der DB sind) und als Funktionen ArtikelAnlegen(), ArtikelÄndern(), ArtikelLöschen()? Diese Funktionen übernimmt ja eigentlich vom Grundsatz hier der DataAdapter?!

    Hat jemand eine kurze Einführung aus der der praktische Sinn der objektorientierten Programmierung wirklich hervor geht (Theorie schön und gut... 8-)), bin auch gerne bereit ein paar Seiten zu lesen, nur sollte das ganze irgendwie praktisch was für mich haben.

    DANKE FÜR ANTWORTEN :thumbup:
    Einfaches Beispiel einer Objektorientierung

    Auto-Klasse

    VB.NET-Quellcode

    1. Public Class Auto
    2. Public Name As String
    3. Public PS As Integer
    4. Public Farbe As Color
    5. Public Sub New(Name As String, PS As Integer, Farbe As Color)
    6. Me.Name = Name
    7. Me.PS = PS
    8. Me.Farbe = Farbe
    9. End Sub


    Anwendung:

    VB.NET-Quellcode

    1. Private Autos As New List(Of Auto)
    2. Autos.Add(New Auto("Ford", 150, Color.Red))
    3. Autos.Add(New Auto("Opel", 45, Color.White))
    4. Autos.Add(New Auto("VW", 102, Color.Black))
    5. Autos.Add(New Auto("Renault", 75, Color.Blue))


    Heißt für eine Liste von Autos zu verwalten legst du eine Klasse an mit den Werten die für ein Auto gespeichert werden sollen. Genauso kann man OOP verwenden wenn man von einer Funktion mehrere Werte zurückgeben möchte

    VB.NET-Quellcode

    1. Private Function GetDefaultAuto() As Auto
    2. Return New Auto("VW", 105, Color.Green)
    3. End Function


    Damit wird eben der Code deutlich übersichtlicher als wenn du es z.B. im CSV Format speichern würdest und dann mit Array Parts arbeiten müsstest, wenn man mit OOP ein Code ließt wird einem gleich klar was wo zugeordnet wird z.B.

    VB.NET-Quellcode

    1. TextBox1.Text = Autos(1).Name
    2. Textbox2.Text = Autos(1).PS.ToString()
    3. Textbox3.Text = Autos(1).Farbe.ToString()


    Würde man ein Array vom Typ String haben sähe das schon schwieriger aus

    VB.NET-Quellcode

    1. Dim Parts As String() = Autos(1).Split(","c)
    2. Textbox1.Text = Parts[0]
    3. Textbox2.Text = Parts[1]
    4. Textbox3.Text = Parts[2]
    Ich benutze zu der OOP noch gerne die Ungarische Notation. Meiner Meinung nach ist der Programmierstil besser, obwohl es VB.Net ist. Vielleicht kennst das schon von PHP. Die Klasse von Dodo säh bei mir dann so aus :

    VB.NET-Quellcode

    1. Public Class Auto
    2. Public mName As String 'm für Member
    3. Public mPS As Integer
    4. Public mFarbe As Color
    5. Public Sub New(Name As String, PS As Integer, Farbe As Color)
    6. mName = Name
    7. mPS = PS
    8. mFarbe = Farbe
    9. End Sub


    Gruß, Trudi :thumbup:
    Nunja ich war zu Schreibfaul *g* normalerweise mache ichs auch Englisch und dann auch mir Datentypspezifischen Präfixen also für Integers "i" Strings "s" usw.

    Dann nutze ich auch meist die Variablen als Private und hole sie mir via Property, also bei mir sähe die Klasse so aus

    VB.NET-Quellcode

    1. Public Class Car
    2. Private sName As String
    3. Private iHP As Integer
    4. Private cColor As Color
    5. Public Sub New(ByVal Name As String, ByVal HP As Integer, ByVal Colour As Color)
    6. sName = Name
    7. iHP = HP
    8. cColor = Colour
    9. End Sub
    10. Public ReadOnly Property Name() As String
    11. Return sName
    12. End Property
    13. Public ReadOnly Property HP() As Integer
    14. Return iHP
    15. End Property
    16. Public ReadOnly Property Colour() As Color
    17. Return cColor
    18. End Property


    Weil manchmal sollen ja nur Werte gelesen aber nicht gesetzt werden, deswegen ReadOnly, zudem kann man hierbei noch Konvertierungen vornehmen, wenn ich z.B. Zeit und Datum seperat zuweisen und auslesen möchte nutzte ich trotzdem EINE gemeinsame Variable und beim auslesen, lese ich in der Property GetTime() nur die Zeit aus der gemeinsamen Variable und bei GetDatE() entsprechend nur das Datum aus, damit spart man sich schonmal eine unnötige Varialbe.
    @Trudi:
    Das ist nun alles mögliche, nur keine Hungarian Notation.
    "m" für Member ist C++.
    Hungarian Notation wäre etwa:

    VB.NET-Quellcode

    1. Public m_strName As String 'm für Member
    2. Public m_iPS As Integer
    3. Public m_colFarbe As Color
    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!
    Ok, dann halt so ^^

    So sieht eine vollständige Klasse in meinem Programmierstil aus :
    Klasse

    VB.NET-Quellcode

    1. Public Class Server
    2. Private mOnlinePlayersCount As Integer
    3. Private mOnlinePlayers As List(Of String)
    4. Private mMaxPlayers As Integer
    5. Private mServerName As String
    6. Private mServerNameValidated As String
    7. Private mValidateServerName As Boolean
    8. Private mMap As String
    9. Private mPing As Integer
    10. ''' <summary>
    11. ''' Initlialisiert die Klasse
    12. ''' </summary>
    13. ''' <param name="Servername">Name vom Server</param>
    14. ''' <param name="OnlinePlayers">Liste mit den Spielern die Online sind</param>
    15. ''' <param name="OnlinePlayersCount">Anzahl der Spieler die Online sind</param>
    16. ''' <param name="MaxPlayers">Maximal erlaubte Spieler auf dem Server</param>
    17. ''' <param name="Map">aktuelle Map auf dem Server</param>
    18. ''' <param name="Ping">Reaktionszeit vom Server</param>
    19. ''' <param name="ValidateName">Soll der validierte Name zurück gegeben werden ?</param>
    20. ''' <remarks></remarks>
    21. Public Sub New(ByVal Servername As String, ByVal OnlinePlayers As List(Of String), ByVal OnlinePlayersCount As Integer, _
    22. ByVal MaxPlayers As Integer, ByVal Map As String, ByVal Ping As Integer, ByVal ValidateName As Boolean)
    23. mServerName = Servername
    24. mServerNameValidated = ServerNameValidator.Validate(Servername)
    25. mValidateServerName = ValidateName
    26. mOnlinePlayers = OnlinePlayers
    27. mOnlinePlayersCount = OnlinePlayersCount
    28. mMaxPlayers = MaxPlayers
    29. mMap = Map
    30. mPing = Ping
    31. End Sub
    32. ''' <summary>
    33. ''' Gibt den Servernamen zurück, wobei entschieden wird ob der Name validiert werden soll oder nicht
    34. ''' ( anhand der ValidateServerName Eigenschaft )
    35. ''' </summary>
    36. ''' <value></value>
    37. ''' <returns>Servername</returns>
    38. ''' <remarks></remarks>
    39. Public ReadOnly Property Name As String
    40. Get
    41. If mValidateServerName = True Then
    42. Return mServerNameValidated
    43. Else
    44. Return mServerName
    45. End If
    46. End Get
    47. End Property
    48. ''' <summary>
    49. ''' Gibt die Anzahl der Spieler zurück, die maximal zugelassen sind
    50. ''' </summary>
    51. ''' <value></value>
    52. ''' <returns>Maximale Spieleranzahl</returns>
    53. ''' <remarks></remarks>
    54. Public ReadOnly Property MaxPlayers As Integer
    55. Get
    56. Return mMaxPlayers
    57. End Get
    58. End Property
    59. ''' <summary>
    60. ''' Gibt die Anzahl der Spieler zurück, welche auf dem Server spielen
    61. ''' </summary>
    62. ''' <value></value>
    63. ''' <returns>Anzahl der Spieler die Online sind</returns>
    64. ''' <remarks></remarks>
    65. Public ReadOnly Property OnlinePlayersCount As Integer
    66. Get
    67. Return mOnlinePlayersCount
    68. End Get
    69. End Property
    70. ''' <summary>
    71. ''' Gibt eine Liste aller Spielernamen die auf dem Server online sind zurück
    72. ''' </summary>
    73. ''' <value></value>
    74. ''' <returns>Liste mit Spielernamen</returns>
    75. ''' <remarks></remarks>
    76. Public ReadOnly Property OnlinePlayers As List(Of String)
    77. Get
    78. Return mOnlinePlayers
    79. End Get
    80. End Property
    81. ''' <summary>
    82. ''' Servername wo nicht das erste Zeichen hinter einem ^ entfernt worden sind
    83. ''' </summary>
    84. ''' <value></value>
    85. ''' <returns>Servername</returns>
    86. ''' <remarks></remarks>
    87. Public ReadOnly Property UnvalidatedServerName As String
    88. Get
    89. Return mServerName
    90. End Get
    91. End Property
    92. ''' <summary>
    93. ''' Servername, wo der erste Buchstabe hinter einem ^ gelöscht wurde
    94. ''' </summary>
    95. ''' <value></value>
    96. ''' <returns>Servername</returns>
    97. ''' <remarks></remarks>
    98. Public ReadOnly Property ValidatedServerName As String
    99. Get
    100. Return mServerNameValidated
    101. End Get
    102. End Property
    103. ''' <summary>
    104. ''' Gibt an, ob der Servername validiert werden soll
    105. ''' </summary>
    106. ''' <value></value>
    107. ''' <returns>gibt zurück ob der Servername validiert werden soll</returns>
    108. ''' <remarks></remarks>
    109. Public Property ValidateServerName As Boolean
    110. Set(ByVal value As Boolean)
    111. mValidateServerName = value
    112. End Set
    113. Get
    114. Return mValidateServerName
    115. End Get
    116. End Property
    117. ''' <summary>
    118. ''' Gibt den Spieltyp vom Server zurück
    119. ''' </summary>
    120. ''' <value></value>
    121. ''' <returns>Spieltyp</returns>
    122. ''' <remarks></remarks>
    123. Public ReadOnly Property Map As String
    124. Get
    125. Return mMap
    126. End Get
    127. End Property
    128. ''' <summary>
    129. ''' Gibt die Reaktionszeit vom Server zurück, bei einem Fehler oder wenn der Server nicht erreicht wurde,
    130. ''' wird -1 zurück gegeben
    131. ''' </summary>
    132. ''' <value></value>
    133. ''' <returns>Reaktionszeit vom Server</returns>
    134. ''' <remarks></remarks>
    135. Public ReadOnly Property Ping As Integer
    136. Get
    137. Return mPing
    138. End Get
    139. End Property
    140. End Class



    Properties sind das beste an der OOP von .Net Sprachen, sonst finde ich C++ besser ^^

    Gruß, Trudi
    Gut gesättigt grad vom Mittag gekommen und sieht da: ERSTMAL DANKE!

    Ja nun ist meine Frage wie das ganze zu meiner Kassenanwendung passt? Ich meine wenn ich das Autobeispiel auf meine Artikel übertrage?! Ich meine muss ich alles doppelt definieren, also einmal in der DB und einmal als Eigenschaft der Klasse Artikel?

    Meine Tabelle Artikel sieht in der DB wie folgt aus:
    ArtNr - Integer (Primärschlüssel; AutoWert)
    ArtBez - String
    MwSt -Integer
    PreisNetto - Double

    Wenn ich zum Beispiel eine Funktion NewArtikel() anlegen will mache ich das in der Klasse Artikel?

    VB.NET-Quellcode

    1. Public Class Artikel
    2. Private m_iArtNr As Integer
    3. Private m_sArtBez As String
    4. Private m_iMwSt As Integer
    5. Private m_dPreisNetto As Double
    6. ' Sub New ist in VB.Net das selbe wie __construct in PHP (ist ein Konstruktor)
    7. Sub New(ByVal ArtNr As Integer, ByVal ArtBez As String, ByVal MwSt As Integer, ByVal PreisNetto As Double)
    8. m_iArtNr = m_iArtNr
    9. m_sArtBez = ArtBez
    10. m_iMwSt = MwSt
    11. m_dPreisNetto = PreisNetto
    12. End Sub
    13. Public ReadOnly Property ArtNr As Integer
    14. Get
    15. Return m_iArtNr
    16. End Get
    17. End Property
    18. Public ReadOnly Property ArtBez As String
    19. Get
    20. Return m_sArtBez
    21. End Get
    22. End Property
    23. Public ReadOnly Property MwSt As Integer
    24. Get
    25. Return m_iMwSt
    26. End Get
    27. End Property
    28. Public ReadOnly Property PreisNetto As Double
    29. Get
    30. Return m_dPreisNetto
    31. End Get
    32. End Property
    33. End Class


    Aufruf :

    VB.NET-Quellcode

    1. Dim art As New Artikel(0, "Spielzeugauto", 19, 69.99)
    2. Dim preis As Double = art.PreisNetto
    3. ' [...]


    Meinst du das so ?

    Gruß, Trudi
    Jetzt wäre das so halb die Klasse Artikel, jedoch ist die Klasse noch nicht mit der DB verbunden? Lasse ich die Klasse so oder wird in die Klasse noch die Verbindung zu DB hergestellt? Macht es überhaupt mit der DB Sinn eine eigene Klasse für Artikel zu erstellen?

    Funktionen für Artikel:
    - Artikel anlegen
    - Artikel ändern
    - Artikel löschen

    - Artikel auf Bon

    Obwohl hier die Frage wäre, ob "Artikel auf Bon" nicht zur Klasse Bon gehört?!
    Aus meiner Sicht fängst Du das von der falschen Seite an.
    Zunächst brauchst Du etwas Basis-Wissen, auch wenn es trocken ist. Das Problem ist nämlich, dass es recht viele Beispiele gibt, wofür man OOP bzw. Klassen braucht. Hier wurden Klassen meist als Datenhalter als Beispiel aufgezeigt. Es gibt aber noch viel mehr Anwendungsgebiete.

    Aus meiner Sicht gibt es zwei Entscheidende Dinge, die man über OOP wissen muss, damit man es einigermaßen versteht:

    1. Unterschied zwischen Klasse und Objekt.
    2. Die Merkmale von OOP.


    Vor allem Punkt 2 ist besonders wichtig. Alleine durch das Merkmal Kapselung erkennt man schnell, wozu man OOP brauchen kann.
    Meine erste Klasse:

    VB.NET-Quellcode

    1. Module Klassen
    2. Public Class SteuernComboBox
    3. Public Sub New(ByVal TEXT As String, ByVal ID As String)
    4. sText = TEXT
    5. iId = ID
    6. End Sub
    7. Private _text As String
    8. Private _id As String
    9. Public Property sText() As String
    10. Get
    11. Return _text
    12. End Get
    13. Set(ByVal TEXT As String)
    14. _text = TEXT
    15. End Set
    16. End Property
    17. Public Property iId() As String
    18. Get
    19. Return _id
    20. End Get
    21. Set(ByVal ID As String)
    22. _id = ID
    23. End Set
    24. End Property
    25. End Class
    26. End Module



    Anwendung:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim ComboList As New List(Of SteuernComboBox)
    4. ComboList.Add(New SteuernComboBox("7 Prozent", 7))
    5. ComboList.Add(New SteuernComboBox("19 Prozent", 19))
    6. For Each ul As SteuernComboBox In ComboList
    7. ComboBox1.Items.Add(ul.sText)
    8. Next
    9. End Sub
    10. End Class


    Soweit so guuuut ;) Also ich habe eine Klasse SteuerComboBox erstellt, die meine Werte für diese ComboBox verwalten soll. Nun habe ich eine Access-Datenbank in der ich nun Arikelt.MwSt mit ComboBox1.Items vergleichen will und bei Übereinstimmung soll der Wert auf default gesetzt werden. Sprich, wenn ein Artikel mit 7 in der DB hinterlegt ist, soll in der ComboBox "7 Prozent" stehen.


    Gruß John

    Memo schrieb:


    Möchtest du fertigen Code :cursing: ? - Falscher Hash ;)
    ----> IMMER HER DAMIT :thumbsup:
    Deine erste Klasse ist ein Modul, ;(
    Module sind VB-Nicht-Net-Code, von Modulen gibt es nur eine Instanz zur Laufzeit.
    Wenn dies Dein Ziel ist, generiere Dir eine richtige Klasse und deklariere die Prozeduren und Variablen mit Shared.
    Oder streiche die Zeilen
    Module Klassen
    End Module
    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!