ArrayList
-
Guten Abend,
ich versuche grade mit ArrayList zu arbeiten und versuche mich an einer Banksimulation.
Ich habe eine Klasse "CKonto" und eine Klasse "CKontobewegung". Das ArrayList ist in CKontoclass CKonto { private ArrayList bewegungen; }
Dieses ArrayList nimmt Objekte von "CKontobewegung". In den Methoden "einzahlen" und "abbuchen", die in der Klasse "CKonto" sind, stecke ich jeweils ein neues Objekt in "bewegungen". In der Methode einzahlen, sieht das z.B. so aus :
public void einzahlen(double betrag, string verwendung) { kontostand += betrag; bewegungen.Add(new CKontobewegung("08.01.2009", verwendung, inhaber, betrag)); }
In der Klasse "CKonto" habe ich außerdem die Methode "kontoauszug". Diese sieht folgt aus :
public void kontoauszug() { for(int j = 0; j < bewegungen.Capacity; j++) { Console.WriteLine("Inhaber: {0}", bewegungen[j].Inhaber()); } }
Ich möchte hier, dass die for-Schleife jeweils die Methode "Inhaber" aus der Klasse "CKontobewegung" in jedem Objekt, welches das ArrayList "bewegungen" aufgenommen hat, ausführt und somit mir der Inhaber dargestellt wird.
Falls es hilft, hier nochmal die Methode "Inhaber" aus der Klasse "CKontobewegung" :public string Inhaber() { return inhaber; }
Die Fehlermeldung, ausgeführt in der for-Schleife, sieht folgt aus :
Fehler 1 "object" enthält keine Definition für "Inhaber", und es konnte keine Erweiterungsmethode "Inhaber" gefunden werden, die ein erstes Argument vom Typ "object" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)
Mit freundlichen Grüßen : FreakY
-
Du bekommst aus der ArrayList ein object, cast nach CKontobewegung hilft:
public void kontoauszug() { for(int j = 0; j < bewegungen.Capacity; j++) { Console.WriteLine("Inhaber: {0}", ((CKontobewegungbewegung)[j]).Inhaber()); } }
Oder nimm lieber gleich System.Collections.Generic.List<CKontobewegung>
-
Hallo
ArrayList sollte man nicht mehr verwenden. Es gibt generische Listen: List<>
chrische
-
Schade funktioniert leider nicht. Folgende Fehlermeldung :
"Bankkonto.CKontobewegung" enthält keine Definition für "bewegungen".
Edit:
chrische5 schrieb:
Hallo
ArrayList sollte man nicht mehr verwenden. Es gibt generische Listen: List<>
chrische
Danke für den Tipp, werde ich dann in Zukunft mir anschauen, doch jetzt hätte ich gerne, wenns denn möglich wäre, die Lösung für das momentane Problem.
-
"Bankkonto.CKontobewegung" enthält keine Definition für "bewegungen".
Entweder schauen was Du da für ein Unsinn treibst oder in CKontobewebung die Methoe bewegung implementieren.
-
Aber es gibt keine Methode und soll keine Methode in "CKontobewegung" namens "bewegungen" geben. "bewegungen" ist ein ArrayList das die Objekte der Klasse "CKontobewegung" aufnimmt und jedes "Inhaber()" der einzelnen Objekte möchte ich mit for-Schleife aufrufen.
-
Dann machst du wohl etwas falsch. Wenn du das Beispiel von "bügel" so übernommen hast, sollte das funktionieren.
Allerdings solltest du als obere Grenze für die
for
-Schleife nichtArrayList.Capacity
verwenden.
Diese Eigenschaft gibt an wieviele Einträge sich in der Liste befinden können, muss aber nicht zwingend mit der Anzahl der tatsächlichen Einträge übereinstimmen. Verwende statt dessen besserArrayList.Count
.Wenn du den Fehler selbst nicht findest solltest du deinen Code hier posten, sonst können wir nur raten.
PS: Wie mein Vorredner bereits sagt,
ArrayList
ist nicht mehr zeitgemäß, verwende besserList<T>
, damit hast du Typsicherheit und sparst dir das casten.
In diesem Zusammenhang kannst du dann auch gleich einen Blick aufforeach
werfen, damit du dich nicht selbst um das Einhalten von Arraygrenzen kümmern musst.
-
ein paar sachen die mir generell auffallen:
1. Einzahlungs datum ist fix?
2. nimm lieber englische bezeichnungen (ist aber nur "geschmackssache")
3. ueberleg dir bessere bezeichnungen - zb hast du beginnendes C bei klassen ?!
4. nimm lieber "List<Bewegungen>"
5. implementier "Inhaber" lieber als property, passt in der syntax am besten
6. "Kontoauszug()" sollte umbenannt werden nach "GibKontoauszug" (besser Englisch, siehe punkt 1)
7. "Kontoauszug()" sollte das ergebnis als string liste zurueck geben statt direkt aus zu geben - wenn du zb statt konsole eine UI verwenden moechtest, brauchst du nicht Kontoauszug nochmal anpassen - stichwort kapselung - OOP - Model-View
8. ich wuerde "auszug, einzahlen, auszahlen" usw von der klasse "Konto" trennen - ein "Konto" beinhaltet nur die daten, aber sollte nicht die interaktion bereitstellen - stichwort OOP - Model-View-Controller... zb was machst du wenn du zwei konten zusammenfuehren willst? - oder splitten
9. warum beinhaltet jede aktion den inhaber? man kann doch auf auf nicht eigene konten geld einzahlen, die einzahlung muss ja nicht nur vom inhaber geschehen, zudem sollte das konto den inhaber kennen, nicht die bewegung- also die ein und ausgabe kannst du in dem programm erstma in der main lassen - da du ja eine console hasst passt das erstma so - spaeter kannst du dann eine UI basteln und brauchst die klassen in keinster weise aendern
- die interaktion wie ein-/ auszahlen sowie kontoauszug und was noch alles kommt in einer separaten bank wie "Kreditinstitut" usw (mit angabe der kontonummer #gg)
- und zuletzt noch ein konto objekt, dieses kennt das objekt "Inhaber" (wieder ein dummes objekt fuer geburtstag, adresse, name)
kennt ausserdem noch den kontostand und den verlauf
- die view, in deinem fall das main "spricht" _nur_ mit dem kreditinstitut, zb durch kontonummer und pin
- das konto wird _nur_ von dem kreditinstitut verwaltetlern am besten gleich richtig OOP, dann hast du es spaeter einfacher
-
Mr Evil schrieb:
...
Danke für all deine Tipps !