Klassen, Property, Konstruktor und Vererbung?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von demolay.

    Klassen, Property, Konstruktor und Vererbung?

    Hallo nochmals!

    Meine Hausaufgaben getalten sich doch etwas komplizieter als erwartet. Deshalb mal ein neuer Thread.
    Ich habe folgende Aufgabe:

    In der zu erstellenden Anwendungen sollen die Daten von Bankkunden gespeichert werden, wobei
    zwischen Privatkunden und Firmenkunden zu unterscheiden ist.


    a. Erstellen Sie eine Klasse ClsKunde, die den Vornamen und Nachnamen sowie den
    Kontostand eines Kunden abspeichern kann.

    b. Stellen Sie durch einen geeigneten Gültigkeitsbereich sicher, dass die Variable für den
    Kontostand eines Kunden auch in von ClsKunde abgeleiteten Klassen verwendet werden
    kann.

    c. Erstellen Sie Property-Methoden zum Lesen und Schreiben des Vor- und Nachnamens
    sowie eine schreibgeschützte Property für den Kontostand.

    d. Programmieren Sie für die Klasse ClsKunde einen Konstruktor, der Parameterwerte für
    den Vor- und Nachnamen entgegennimmt und diese den entsprechenden Instanzvariablen
    bei der Erstellung eines Kundenobjektes zuweist.

    e. Erstellen Sie eine Methode GibZinsen, welche die für den aktuellen Kontostand pro
    Jahr anfallenden Zinsen berechnet und zurückgibt. Gehen Sie dabei von einem Zinssatz
    von 1,25% aus.

    f. Sorgen Sie dafür, dass die Methode GibZinsen in abgeleiteten Klassen überschrieben
    werden kann.

    g. Kopieren Sie den folgenden Methodenrumpf in die Klasse ClsKunde:
    Public Overrides Function ToString() As String
    End Function
    Implementieren Sie diese Methode so, dass eine Zeichenkette bestehend aus dem Vor- und
    dem Nachnamen des Kunden zurückgegeben wird.


    Tja, kurz gesagt habe ich wenig Ahnung wie das Meiste davon geht, habe es aber mal so probiert (Bei f und g habe ich absolut keinen PLAN):

    VB.NET-Quellcode

    1. Public Class ClsKunde
    2. Private _Vorname As String
    3. Private _Nachname As String
    4. Private _Vermoegen As Double
    5. Private _Gibzinsen As Double
    6. Public Property Vorname() As String
    7. Get
    8. Return _Vorname
    9. End Get
    10. Set(ByVal value As String)
    11. _Vorname = value
    12. End Set
    13. End Property
    14. Public Sub New(ByVal Vorname As String)
    15. _Vorname = Vorname
    16. End Sub
    17. Public Property Nachname() As String
    18. Get
    19. Return _Nachname
    20. End Get
    21. Set(ByVal value As String)
    22. _Nachname = value
    23. End Set
    24. End Property
    25. Public Sub New(ByVal Nachname As String)
    26. _Nachname = Nachname
    27. End Sub
    28. Public Overrides Function ToString() As String
    29. End Function
    30. Public ReadOnly Property Vermoegen() As Double
    31. Get
    32. Return _Vermoegen
    33. End Get
    34. End Property
    35. Public Sub New(ByVal Gibzinsen As Double)
    36. _Gibzinsen = Vermoegen / 100 * 125
    37. End Sub
    38. End Class


    Edit by Agent: VB-Tag eingefügt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Agent“ ()

    g) ist doch ganz einfach:

    VB.NET-Quellcode

    1. Public Overrides Function ToString() As String
    2. return _Vorname & " " & _Nachname
    3. End Function


    Zitat aus MSDN:
    ...Overridable kennzeichnet eine Methode als überschreibbar, also als nicht endgültig implementiert. In einer abgeleiteten KLasse kann die Methode neu implementiert werden und muss dort mit Overrides gekennzeichnet sein...
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

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

    Hallo Smith ;)

    so einfach ist das für mich gar nicht.
    Ich habs mal bei Zeile 31 ersetzt.

    Und f) ?

    In Zeile 17 ist immer das New unterschlängelt, ich weiß aber nicht warum. Die Fehlermeldung ist :

    "Public Sub New(Vorname As String)" hat mehrere Definitionen mit identischen Signaturen.

    In Zeile 28 bekomme ich diese Meldung nicht. Warum?

    Gibt es vielleicht ordentliche Literatur, wo ich diese Dinge nachlesen kann?
    f) siehe mein Zitat: "Overridable"

    Da du mehrere Konstruktoren mit "New" angelegt hast, musst du diese mit "Overloads" entsprechend kennzeichnen.

    Wenn dies noch nicht so einfach für dich ist, solltest du dich zunächst näher mit OOP beschäftigen, es gibt bestimmt jede Menge Tutors und Übungen.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Öhm, schön wärs! Klar gibt es tutorien. Da kann ich schlecht hin, da ich hauptsächlich Wirtschaftsingenieur studiere und deshalb mein Vorlesungsplan zu dieser Zeit immer andere Fächer vorschreibt.

    Diese Hausaufgaben sind nun leider mal der Zugang zur Klausur.

    Ich würde hier niemals freiwillig so doofe Fragen stellen aber mir sitzt die Zeit im Nacken...

    Habe ich das richitg verstanden:

    Public overloads sub(ByVal Vorname As String)
    _Vorname = Vorname
    End Sub

    Dann erwartet man von mir aber einen Bezeichner nach sub. Was ist das?

    Sieht der restliche Text denn gut aus?
    Hi!

    Das Problem ist, dass du 2 Konstruktoren hast, die beide String annehmen (einer mit Vorname, einer mit Nachname). Wenn du jetzt x = new clsKunde("Maier") machst, kann ein doofer Computer schwer sagen, ob der Typ jetzt den Vornamen Maier oder den Nachnamen Maier hat ;)

    Ich würde hier einen Constructor machen, der Nachnamen annimmt und einen, der Vor- und Nachnamen annimmt. In den wenigsten Fällen wird man nen Kunden haben, von dem nur der Vorname bekannt ist, jedoch nicht der Nachname. In dem (Sonder-)Fall müsste man einen leeren Kunden anlegen und über die Eigenschaft einen Vornamen zuweisen. Dazu brauchst du dann noch einen leeren Constructor (also einen, der keine Parameter annimmt).


    mfG Andy



    PS: Ich finds interessant, dass so viele Schüler und Studenten mit ihren (Haus-)Aufgaben nicht fertig werden. Das kann doch nicht sein, dass von euch was verlang wird, was ihr nie gemacht habt bzw. nicht die Möglichkeit hattet es zu lernen?!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mad Andy“ ()

    Wenn ich New einfüge dann wird erst richtig gemeckert. Ich bin mir da nicht sicher. Wenn ich einfach "Identität" voranstelle, dann bekomme ich keine Fehlermeldung.

    Die Idee die beiden Konstruktore zusammenzufassen gefällt mir.
    Und jetzt bitte nicht steinigen...ist das so richtig?

    VB.NET-Quellcode

    1. Public Class ClsKunde
    2. Private _Vorname As String
    3. Private _Nachname As String
    4. Private _Vermoegen As Double
    5. Private _Gibzinsen As Double
    6. Public Property Vorname() As String
    7. Get
    8. Return _Vorname
    9. End Get
    10. Set(ByVal value As String)
    11. _Vorname = value
    12. End Set
    13. End Property
    14. Public Property Nachname() As String
    15. Get
    16. Return _Nachname
    17. End Get
    18. Set(ByVal value As String)
    19. _Nachname = value
    20. End Set
    21. End Property
    22. Public Sub New(ByVal Vorname As String, ByVal Nachname As String)
    23. _Vorname = Vorname
    24. _Nachname = Nachname
    25. End Sub
    26. Public Overrides Function ToString() As String
    27. Return _Vorname & " " & _Nachname
    28. End Function
    29. Public ReadOnly Property Vermoegen() As Double
    30. Get
    31. Return _Vermoegen
    32. End Get
    33. End Property
    34. Public Sub New(ByVal Gibzinsen As Double)
    35. _Gibzinsen = Vermoegen / 100 * 125
    36. End Sub
    37. End Class




    PS.:Doch leider. Es hieß letzte Vorlesung: Die Folien lese ich Ihnen jetzt aber nicht vor, das machen Sie mal im Selbststudium...
    Er hatte uns bis zu diesem Zeitpunkt Arrays, Objekte, Methoden, KLassen und die Definition für Vererbung und Polymorphismus "erklärt"
    Und jetzt knoble ich hier schon den ganzen Tag an meinen Aufgaben. Was ich hier erfrage ist nicht einmal ein Drittel davon :(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „demolay“ ()

    Hi!

    Ein Constructor, der nur Gibzinsen annimmt macht irgendwie keinen Sinn... besonders, wenn du die übergebene Variable nichtmal verwendest.

    b. Stellen Sie durch einen geeigneten Gültigkeitsbereich sicher, dass die Variable für den
    Kontostand eines Kunden auch in von ClsKunde abgeleiteten Klassen verwendet werden
    kann.
    Hierfür musst du die Variable _Vermoegen als protected deklarieren.

    e. Erstellen Sie eine Methode GibZinsen, welche die für den aktuellen Kontostand pro
    Jahr anfallenden Zinsen berechnet und zurückgibt. Gehen Sie dabei von einem Zinssatz
    von 1,25% aus.

    Das war wohl dein missglückter Versuch von oben...
    Das ist über eine Funktion zu lösen:

    VB.NET-Quellcode

    1. Public Overridable Function GibZinsen () As Double
    2. return (Vermoegen / 100 * 125)
    3. End Function

    Die Variable _Gibzinsen gibts nicht, da die Zinsen ja nicht (zwischen-)gespeichert werden, sondern beim Aufrufen der Funktion berechnet und sofort zurück gegeben werden. Mit dem Schlüsselwort "Overridable", kann die Funktion in abgeleiteten Klassen überschrieben werden (siehe Agent's post).

    ansonsten müsste es passen :)


    mfG Andy


    PS: Normalerweise gleidert man Klassen mit #Region ... #End Region.
    Das Könnte dann in etwa so aussehen:

    VB.NET-Quellcode

    1. Public Class clsKunde
    2. #Region "Public Vars"
    3. 'du hast keine public Variablen, also kannst du den Block weglassen
    4. #End Region
    5. #Region "Private Vars"
    6. 'deine priavate Variablen
    7. #End Region
    8. #Region "Getters"
    9. 'Hier kommen alle Properties rein, die nur dazu da sind eine priavte Variable aus der Klasse "raus" zu bekommen.
    10. 'In deinem Fall nur Vermoegen
    11. #End Region
    12. #Region "Properties"
    13. 'Hier kommen dann alle anderen Properties rein
    14. #End Region
    15. #Region "Constructors"
    16. 'Hier kommen deine Konstruktoren rein
    17. 'in deinem Fall nur der eine, dens gibt ;)
    18. #End Region
    19. #Region "Distructor"
    20. 'Hier würde der Distructor rein kommen
    21. 'Kannst du weg lassen, da es bei dir keinen gibt.
    22. #End Region
    23. #Region "Methods"
    24. 'hier kommen dann alle Subs und Funktionen rein, die nicht überschrieben WERDEN
    25. 'überschreibbare, die nicht geerbt werden kommen hier also auch rein
    26. #End Region
    27. #Region "Overrides"
    28. 'hier kommen dann alle Subs und Funktionen rein, die überschrieben werden
    29. 'in deinem Fall ist das keine, somit kannst du diesen Region-Block auch weg lassen
    30. #End Region
    31. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mad Andy“ ()

    Ok, habe das mal geändert und neu sortiert.
    Protected habe ich noch gar nicht kennen gelernt! Und dass man so sortiert auch nicht.
    DAfür aber besonderen Dank.
    Hatte bei C++ immer das Prolem, dass ich keine Strucktur hatte, an der ich mich langhangeln konnte, bis OOP kam, dann war alles klar. Und bei VB bin ich noch lange nicht dabei, aber diese Gleiderung wird bestimmt helfen :))

    Noch eine kleine Frage: Ich habe meine Variablen alle schon oben instanziert (? zum double oder string gemacht) In den Properties taucht diese Einordnung ja nochmal auf. Ist das nicht doppelt gemoppelt?

    Kann ich unter den source code nun ein Häckchen machen und meine Nerven an den restlichen Aufgaben aufreiben :D ?

    VB.NET-Quellcode

    1. Public Class ClsKunde
    2. #Region "Private Vars"
    3. Private _Vorname As String
    4. Private _Nachname As String
    5. Protected _Vermoegen As Double
    6. Private _Gibzinsen As Double
    7. #End Region
    8. #Region "Getters"
    9. Public ReadOnly Property Vermoegen() As Double
    10. Get
    11. Return _Vermoegen
    12. End Get
    13. End Property
    14. #End Region
    15. #Region "Properties"
    16. Public Property Vorname() As String
    17. Get
    18. Return _Vorname
    19. End Get
    20. Set(ByVal value As String)
    21. _Vorname = value
    22. End Set
    23. End Property
    24. Public Property Nachname() As String
    25. Get
    26. Return _Nachname
    27. End Get
    28. Set(ByVal value As String)
    29. _Nachname = value
    30. End Set
    31. End Property
    32. #End Region
    33. #Region "Constructors"
    34. Public Sub New(ByVal Vorname As String, ByVal Nachname As String)
    35. _Vorname = Vorname
    36. _Nachname = Nachname
    37. End Sub
    38. #End Region
    39. #Region "Methods"
    40. Public Overrides Function ToString() As String
    41. Return _Vorname & " " & _Nachname
    42. End Function
    43. Public Overridable Function GibZinsen() As Double
    44. Return (Vermoegen / 100 * 125)
    45. End Function
    46. #End Region
    47. End Class


    sehe gerade, dass es bei der Zinsberechnung doch heißen müsste : Gibzinsen = Vermoegen *125 / 10000

    wäre schon, wenns 25% Zinsen gäbe ;)

    Falls das nun so korrekt ist, dann hat sich der Thread erledigt.
    Möchte allen für Ihre Hilfe danken!!!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „demolay“ ()