Objektorientiertes Programmieren

  • VB.NET

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

    Objektorientiertes Programmieren

    Hallo @ all

    Ich beschäftige mich gerade mit Klassen und der Objektorientrierten Programierung. Habe dazu einige fragen ob ich es richtig verstanden habe.

    Meine Klasse sieht so aus:

    VB.NET-Quellcode

    1. Public Class Kuchen
    2. Public mehl As Integer
    3. Public zucker As Integer
    4. Public butter As Integer
    5. Public eier As Integer
    6. Private Stuecke As Integer = 16
    7. Private Teig As Boolean = True
    8. Public Sub Essen(ByVal gegessen As Integer)
    9. Stuecke = Stuecke - gegessen
    10. End Sub
    11. Public Sub backen()
    12. Teig = False
    13. End Sub
    14. End Class

    Das Public / Private steht dafür ob ich die Variablen/Funktionen von woanders aufrufen kann. Ich kann zum Beispiel die Variable Mehl "sehen" die Variable Teig aber nicht. Ist das alles oder verbiergt sich hinter diesen Stichworten noch was anderes?

    Jetzt habe ich in Meiner Form zum Beispiel so was:

    VB.NET-Quellcode

    1. Dim k1 as new Kuchen
    2. k1.mehl=300
    3. k1.backen()

    Über k1.mehl kann ich die Variable verändern oder abrufen. Mit k1.backen rufe ich die Funktion auf welche die Variable vom Teig verändert.
    Stimmt das soweit alles? Fange halt gerade erst damit an und möchte sicher gehen damit ich es mir nicht falsch einpräge :)

    Bei der Deklaration vom Kuchen muss ich das Stichwort new benutzen. Das verstehe ich leider noch nicht genau. Warum muss das gemacht werden und warum kann nicht einfach:

    VB.NET-Quellcode

    1. Dim k1 as Kuchen

    geschrieben werden? Was bewirkt dieses?

    In den nächsten Tagen beschäftige ich mich dann mit Vererbung. Kann sein das ich dann nochmal eure Hilfe brauche ;) Ich schreibe dann einfach hier nochmal rein. Bis es dazu aber kommt hoffe ich das ihr mir bei meinem Problem helfen könnt.

    Viele Grüße
    Croasider
    Den Kuchen würde ich eher so definieren:

    VB.NET-Quellcode

    1. Public Class Kuchen
    2. Private _mehl, _eier, _zucker, _butter As Integer
    3. Private _stuecke As Integer
    4. Private fertig As Boolean = False, geschnitten As Boolean = False
    5. Private stueckeVorhanden As Int32
    6. 'Wie viel war da doch gleich noch drin ("später nochmal nachschauen")?
    7. Public ReadOnly Property Mehl() As Int32
    8. Get
    9. Return _mehl
    10. End Get
    11. End Property
    12. 'ebenso für Eier, Zucker, Butter
    13. Public Sub New(Optional ByVal mehl As Int32 = 300, Optional ByVal eier As Int32 = 3, Optional ByVal zucker As Int32 = 250, Optional ByVal butter As Int32 = 50)
    14. 'Kuchen ("Klasseninstanz") erstellen (NICHT backen, nur die Zutaten in die Schüssel)
    15. _mehl = mehl
    16. _eier = eier
    17. _zucker = zucker
    18. _butter = butter
    19. End Sub
    20. Public Sub Backen()
    21. 'Nochmal backen ist sinnlos
    22. If fertig Then Throw New InvalidOperationException("Dieser Kuchen ist bereits fertig!")
    23. 'ansonsten: Aktion ausführen
    24. fertig = True
    25. End Sub
    26. Public Sub Schneiden(ByVal stuecke As Int32)
    27. 'Kuchen schon gebacken?
    28. If Not fertig Then Throw New InvalidOperationException("Der Kuchen wurde noch nicht gebacken und kann deshalb nicht geschnitten werden!")
    29. 'Nochmal schneiden ist auch sinnlos
    30. If geschnitten Then Throw New InvalidOperationException("Der Kuchen wurde bereits geschnitten!")
    31. 'Anzahl vorhandener Stücke festlegen
    32. stueckeVorhanden = stuecke
    33. geschnitten = True
    34. End Sub
    35. Public Sub Essen(ByVal stueck As Int32)
    36. 'Kuchen schon geschnitten?
    37. If Not geschnitten Then Throw New InvalidOperationException("Der Kuchen muss erst geschnitten werden!")
    38. 'Mehr Hunger als Stücke da sind? --> Das ist schlecht.
    39. If stueckeVorhanden < stueck Then Throw New InvalidOperationException("Es sind nur noch " & stueckeVorhanden & " Stücke da!")
    40. 'Stücke futtern
    41. stueckeVorhanden -= stueck
    42. End Sub
    43. End Class


    Verwendung:

    VB.NET-Quellcode

    1. Dim k As New Kuchen
    2. k.Backen()
    3. k.Backen() 'geht nicht
    4. k.Schneiden(12) 'in 12 Stücke schneiden
    5. k.Essen(2)
    6. k.Essen(3)
    7. k.Essen(1)
    8. k.Essen(7) 'geht nicht, es sind nur noch 6 Stücke da!
    9. k.Schneiden(12) 'nochmal auffüllen-cheat: geht nicht, es muss ein neuer Kuchen her. Dadurch werden allerdings die restlichen Stücke verschwendet, was sich in diesem Fall nicht sauber ohne dem Threadersteller noch unbekannte Methoden verhindern lässt.


    Es gibt natürlich noch schöne Spielereien wie z.B. Fabrikmethoden, die Anzahl gleichzeitig verfügbarer Kuchen beschränken ("Es gibt schon einen Kuchen - iss erst den alten, bevor du einen neuen bäckst"). Dabei können die Zutaten auch über Eigenschaften oder die Fabrikmethode selbst zugeführt werden, denn der Konstruktor steht dafür nicht zur Verfügung (wird Private gesetzt, damit sich niemand einen Kuchen "unter der Hand" beschaffen kann).
    Gruß
    hal2000

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

    Bei der Deklaration vom Kuchen muss ich das Stichwort new benutzen. Das verstehe ich leider noch nicht genau. Warum muss das gemacht werden und warum kann nicht einfach:
    Dim k1 as Kuchen
    geschrieben werden? Was bewirkt dieses?

    Eine Klasse (hier: "Kuchen") ist in Normalfall eine Schablone. Du definierst dort deine Variablen/Properties/Methoden. Diejenigen, die für alle sichtbar sein sollen, als Public; die anderen, die von außen nicht verändert werden sollen, "versteckst" du, indem du sie auf Private, oder auf "Friend" stellst. Das sind die -> Gültigkeitsbereiche.
    Mit

    VB.NET-Quellcode

    1. Dim k1 as Kuchen
    teilst du dem Programm mit, dass k1 ein Objekt vom Typ Kuchen ist. K1 muss jetzt allerdings noch ein "Kuchen"-Objekt zugewiesen werden. Wenn du noch keines hast, welches du zuweisen kannst, dann erstellst du ein neues:

    VB.NET-Quellcode

    1. k1 = new Kuchen

    Die letzten beiden Anweisungen werden dann oft zusammengefasst (Es gibt auch Ausnahmen) in eine einzige Anweisung:

    VB.NET-Quellcode

    1. Dim k1 as new Kuchen


    lg, der_Kurt

    PS: Gute Frage, und auch schon eine gute Antwort erhalten. Ich habe den Thread bewertet. ;)
    In meinem Buch, welches ich damals gelesen habe, gab es diese OOP Erklärung mit einem Konto.

    Man kann solch eine Konto Klasse richtig ausweiten. Methoden, Kontonr, etc.

    LG

    PS: Wäre auch einmal eine gute Übung, wenn du keine Lust mehr auf Kuchen hast.
    @Kurt: Bei der Gültigkeit muss ich dich korrigieren: Die 4 Zugriffsmodifizierer Private, Protected, Friend und Public regeln nicht die Gültigkeit, sondern die Sichtbarkeit (Anweisung / Einschränkung für Aufrufer). Die Gültigkeit wird über Shared, Dim ("Nonshared") und Static festgelegt (Arbeitsanweisung für den GC).
    Gruß
    hal2000