Variable einer Klasse in anderer Klasse ändern

  • VB.NET

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

    Variable einer Klasse in anderer Klasse ändern

    Hallo!
    Ich bin neu hier und würde mich mit einer kurzen Problemstellung gerne an euch richten. Ich bin echt kein Programmier-Profi, aber muss es für mein Studium zumindest ansatzweise können. Nun zu meinem Problem: Ich muss eine Aufgabe von meiner Professorin lösen und dies ist mir auch fast vollständig gelungen, nur hänge ich jetzt an einem kleinen aber entscheidendem Punkt. Ich habe vor die Variable x (siehe Quellcode) in der Klasse Form1 zu erstellen. Diese soll dann durch den Sub einer anderen Klasse aufgerufen werden und (wichtig!) geändert werden. Ich will danach mit dem veränderten Wert der Variable in Form1 weiterarbeiten. Leider lässt die Aufgabenstellung keine Abweichung von den Klassen oder des Subs (z.B stattdessen Function) zu.
    Obwohl ich die Variable per Referenz in dem Sub aufrufe, wird sie einfach nicht geändert. Geht das generell nicht klassenübergreifend oder ist mir ein Fehler unterlaufen?
    Ich kann mir denken, dass die Antwort vermutlich recht simpel ist, aber dennoch wäre ich über jede Hilfe froh!
    Vielen Dank! :)
    manu123

    Hier der Code (Auszugsweise):

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim A1 As New Getränkedosenautomat
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim x As String
    5. x = InputBox("Anzahl Dosen = ?", "Dosen hinzufügen")
    6. If IsNumeric(x) Then
    7. A1.Bestücken(CInt(x))
    8. MsgBox("Die Bestückung war erfolgreich!",, "Bestücken")
    9. If A1.AktuellerStand = 100 Then
    10. MsgBox("Der Automat ist jetzt voll!", vbCritical)
    11. End If
    12. If CInt(x) > 0 Then
    13. MsgBox("Es konnten leider nur " & x & " Dose(n) bestückt werden, da der Automat jetzt voll ist!",, "Bestücken")
    14. End If
    15. Else
    16. MsgBox("Es wurde keine korrekte Zahl eingegeben!", vbCritical)
    17. End If
    18. TextBox_Anzahl.Text = CStr(A1.AktuellerStand)
    19. End Sub
    20. End Class



    VB.NET-Quellcode

    1. Public Class Getränkedosenautomat
    2. Private AnzahlDosen As Byte
    3. Private Fassungsvermögen As Byte = 100
    4. Public Sub Bestücken(ByRef Anzahl As Integer)
    5. If AnzahlDosen + Anzahl <= Fassungsvermögen Then
    6. AnzahlDosen = CByte(AnzahlDosen + Anzahl)
    7. Anzahl = 0
    8. Else
    9. Anzahl = Fassungsvermögen - AnzahlDosen
    10. AnzahlDosen = Fassungsvermögen
    11. End If
    12. End Sub
    13. ...
    14. End Class
    1. Willkommen im Forum.
    2. Natürlich ist es möglich, aus einer Klasse Variablen einer anderen zu ändern. In vielen Fällen ist es aber nicht sinnvoll, da dafür die Klasse mit der Variable selber verantwortlich sein sollte.
    3. Sobald Du x (es gibt bessere, da vielsagendere Variablennamen) als das deklarierst, was es sein soll, nämlich Byte, wird klar, wo der Haken liegt. Du übergibst in Zeile#9 eine Integer-Interpretation eines InputBox-Textes an die Getränkeautomatenklasse. Und diese Interpretation wird dann mittels ByRef verarbeitet. Aber das heißt noch lange nicht, dass diese Bearbeitung zurück auf den interpretierten Wert x (der bei Dir ja noch ein String ist) übertragen wird. Das würde etwas zu weit gehen und ist auch nicht sinnvoll. Statt also eine Interpretation eines Textes zu übergeben, übergib x selber an die Funktion.
    4. Entferne mal bitte aus den Projektverweisen den Microsoft.VisualBasic-Namespace; Mit den Folgefehlern kannst Du umgehen? RodFromGermany würde Dir nach Entfernung von IsNumeric bestimmt gerne seine Rouladen mit Klöße in den Getränkeautomaten einwerfen, von daher solltest Du für den Fall gewappnet sein (Stichwort Try-Catch oder auch TryParse als aktuellere Gefahrenabwehralternativen zur VB6-Funktion IsNumeric).
    5. In diesem Zusammenhang ist auch eine Wertprüfung an sich sinnvoll. Nicht dass jemand mit einem LKW-Konvoi vorbeikommt, der die Jahresproduktion NukaCola in den Getränkeautomaten pressen will. Eingabewerte sollten auf ein gewisses Maß beschränkt werden (ggf. < 256, damit es zu Byte passt?)
    6. Für MsgBox() gibt es das VB.Net-Pendant MessageBox.Show(), für die InputBox könntest Du Dir was eigenes basteln, darfst aber auch Microsoft.VisualBasic.InputBox verwenden. Ja, mit vollem Namen, um beim Lesen Dich immer wieder drauf zu stoßen, dass Du Uraltkonserven aus dem vergangenen Jahrtausend nutzt :P
    7. Ist AktuellerStand eine Function? ReadOnly Property? Public Variable? Hat keinen Einfluss auf den Code, nur auf die Qualität.
    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.

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

    @manu123 Ebenfalls Willkommen im Forum. :?:
    Die Main-(Parent-)Klasse instanziiert eine Child-Klasse und kann direkt dort Werte (Properties) ändern und Prozeduren aufrufen.
    Wenn die Child-Klasse seinem Parent was zu sagen hat, wird dafür ein Event verwendet!
    Die Main-(Parent-)Klasse aboniert dieses Event (identisch zu Button-Click) und tut dann das, was zu tun ist.
    Und:
    Wenn Du die Anzahl der Dosen ermittelst, ist das in jedem Falle ein numerischer Wert, da ist es nicht sinnvoll, einen String als Variable abzulegen, sondern dieser wird sofort in einen numerischen Wert konvertiert.
    Die Abfrage

    manu123 schrieb:

    VB.NET-Quellcode

    1. If A1.AktuellerStand = 100 Then
    geht schief, wenn 59 Dosen drinne sind und Du 42 hinzufügst.
    Das kriegst Du aber allein raus.
    Und:
    Machst Du stets Option Strict On.
    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 Leute,
    Danke für die schnellen Antworten! Habe mittlerweile herausgefunden, dass ich das ganze auch als Funktion schreiben darf und dann funktioniert es auch. Trotzdem haben mir die Antworten weiter geholfen, habe denke ich meine Fehler erkannt.

    VaporiZed schrieb:

    Ja, mit vollem Namen, um beim Lesen Dich immer wieder drauf zu stoßen, dass Du Uraltkonserven aus dem vergangenen Jahrtausend nutzt :P

    So wird das an meiner Hochschule eben gelehrt :D . Habe aufgehört mir über die Zweckmäßigkeit der Lehrveranstaltung Gedanken zu machen, erst recht wenn diese von einer über 60-Jährigen gehalten wird, die nicht im geringsten Ahnung von Programmieren oder ähnlichem hat. Als Wirtschaftsingenieur wird mir das später hoffentlich nicht so viele Probleme bescheren :P .

    Vielen Dank nochmal für die Hilfe!
    Gruß,
    manu123

    manu123 schrieb:

    die nicht im geringsten Ahnung von Programmieren oder ähnlichem hat.
    Das ist echt ein Problem, da Du vieles falsch beigebracht bekommst, was Du später mühselig wieder ablegen musst.
    Wie verhält sich der Prof wenn Ihr "Verbesserungsvorschläge" einbringt?
    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!