Klassenprogrammierung: Wozu Let und Get in Methoden/Funktionen notwendig?

  • Word

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von SARS-CoV-2.

    Klassenprogrammierung: Wozu Let und Get in Methoden/Funktionen notwendig?

    Guten Tag,

    ich komme ursprünglich aus dem C++-Bereich und arbeite mich momentan in VBA ein. Dabei fiel mir gleich etwas auf was ich nicht ganz verstehe.
    Und zwar bin ich bei der Klassenprogrammierung auf Methoden/Funktionen gestoßen die mit "Property Let" und "Property Get" eingeleitet werden.

    Beispiel:

    VB.NET-Quellcode

    1. Public Property Get Alter() As Variant
    2. Alter = iAlter
    3. End Property
    4. Public Property Let Alter(ByVal NewValue As Variant)
    5. iAlter = NewValue
    6. End Property


    Nun frage ich mich, was dieses "Property Let" und "Property Get" genau bewirkt. Denn grundsätzlich funktioniert es auch ohne, Beispiel:

    VB.NET-Quellcode

    1. Public Function Alter() As Variant
    2. Alter = iAlter
    3. End Function
    4. Public Baujahr(ByVal NewValue As Variant)
    5. iAlter = NewValue
    6. End Sub


    Aber irgendeinen Vorteil muss "Let" und "Get" ja haben. Zuerst dachte ich bei Let und Get an die Datenkapselung, aber die ist auch ohne Let und Get gegeben, wenn ich das Attribut Alter in der Klasse als privat deklariere.

    Vielleicht kann mir ja jemand auf die Sprünge helfen.
    Vielen Dank im Voraus!
    Willkommen im Forum.

    Properties sind quasi potentiell smarte Variablen. Das hast Du wahrscheinlich schon selber erkannt. Soweit kein Unterschied zu Methoden. Du kannst mit beiden z.B. Wertprüfungen vor Zuweisungen machen (Sub/Let) oder bedingte Rückgaben ermöglichen (Function/Get). Auf stackoverflow gibt es z.B. eine Erläuterung. Meine Zusammenfassung: Properties sind zur Verarbeitung von Variablenwerten gedacht, Methoden zur Verarbeitung komplexerer Logik. Generell eine Suchanfrage: Properties vs methods.

    ##########

    Allerdings halte ich mich auch nicht immer an diese Orientierung. 1. beim Thema IOSP, 2. kann man durch Anwendung von Methoden durch gute Benennung ebendieser oft gut klar machen, was man macht und muss nicht sagen, wie man es macht. So kann man eine Variablenwertänderung manchmal eben besser klar machen, indem man nicht den Let-Teil aufruft, sondern indem man eine Methode hat, die SetzeDenWertZwischenDieGesetzlichErlaubtenGrenzen heiß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 1 mal editiert, zuletzt von „VaporiZed“ ()

    VaporiZed schrieb:

    Willkommen im Forum.

    Properties sind quasi potentiell smarte Variablen. Das hast Du wahrscheinlich schon selber erkannt. Soweit kein Unterschied zu Methoden. Du kannst mit beiden z.B. Wertprüfungen vor Zuweisungen machen (Sub/Let) oder bedingte Rückgaben ermöglichen (Function/Get). Auf stackoverflow gibt es z.B. eine Erläuterung. Meine Zusammenfassung: Properties sind zur Verarbeitung von Variablenwerten gedacht, Methoden zur Verarbeitung komplexerer Logik. Generell eine Suchanfrage: Properties vs methods.


    Hey, Danke für Deine Antwort.

    Habe von Propertys tatsächlich - in dem Zusammenhang - noch nichts gehört.

    Was soll ich mir unter Propertys vorstellen? Spezielle Methoden?

    Das einzige was ich mir unter Propertys vorstellen kann, sind Attribute einer Klasse (so wie ich es aus C++ kenne). Ein Objekt besteht immer aus Methoden und Attributen (aka Propertys?). Aber das scheint in diesem Fall wohl eine andere Bedeutung zu haben?

    Handelt es sich bei Alter jetzt um ein Attribut/Eigenschaft (aka. Property)?

    VB.NET-Quellcode

    1. Public Property Get Alter() As Variant
    2. Alter = iAlter
    3. End Property


    Dann verstehe ich das ganze nicht! Denn Attribute sind ja nur da um bestimmte Zustände zu speichern. Für mich ist Alter eine Methode.


    In deinem Link steht, das Methoden Aktionen ausführen, und Propertys Eigenschaften darstellen. So kenne ich das auch aus der OOP. Aber ich verstehe das in diesem Zusammenhang nicht - da für mich Alter eine Methode ist, und kein Attribut. Irgendwo ist noch ein Verständnisproblem.

    Sorry, aber irgendwie/irgendwo stehe ich auf dem Schlauch!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SARS-CoV-2“ ()

    Ja, Alter ist eine Property/Eigenschaft. Sie ist hier dafür da, um die interne Variable iAlter zu verbergen, aber gleichzeitig in von Dir konktrolliertem Maße* für die Außenwelt zugreifbar zu machen. Die Verwendung ist wie die einer normalen Variablen, die Komplexität die einer Methode.

    Visual Basic-Quellcode

    1. Alter = 1 'ruft die Let-Methode auf und übergibt für den Parameter NewValue den Wert 1
    2. MsgBox Alter 'ruft die Get-Methode auf und gibt den Wert von iAlter wieder

    Vielleicht trägt zur Verwirrung bei, dass man in VB6/VBA schreiben muss:

    Visual Basic-Quellcode

    1. Public Property Get Alter() As Variant
    2. Alter = iAlter 'scheinbar wird dem Namen der Methode ein Wert zugewiesen
    3. End Property

    in VB.NET würde man einfach im Getter schreiben

    VB.NET-Quellcode

    1. Return iAlter



    *denn Du kannst im Let-Bereich schreiben: If NewValue < 0 Then NewValue = 0, um so illegale Werte zu verhindern.
    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.
    Ja, Alter ist eine Property/Eigenschaft.
    Sie ist hier dafür da, um die interne Variable iAlter zu verbergen,
    aber gleichzeitig in von Dir konktrolliertem Maße* für die Außenwelt
    zugreifbar zu machen. Die Verwendung ist wie die einer normalen
    Variablen, die Komplexität die einer Methode.


    Okay, das ist zunächst etwas Hinknotig für mich dies als Eigenschaft anzuerkennen. Danke, endlich verstehe ich das ein Stück weit mehr, bin schon am verzweifeln gewesen (kennt denke ich jeder Programmierer).
    Das bedeutet dann ja, das VBA in bestimmten Umfang die Datenkapselung dadurch selber regelt und dann das Property als eine Art Schnittstelle zur Verfügung stellt, gelle?


    Vielleicht trägt zur Verwirrung bei, dass man in VB6/VBA schreiben muss:

    Public Property Get Alter() As Variant
    Alter = iAlter 'scheinbar wird dem Namen der Methode ein Wert zugewiesen
    End Property


    Das habe ich bereits herausgefunden, das war zuerst verwirrend für mich da ich das eigentlich nur mit einer Return-Anweisung kenne, wie in Deinem Beispiel. Daran hab ich mich aber schnell gewöhnen können.

    Danke für die Mühe und Geduld!