Moin,
hoffe, dass das Thema hier richtig plaziert ist.
Habe gerade ein kleines Verständnisproblem und hoffe mich kann hier wer in die richtige Richtung schubsen.
Kurzbeschreibung:
Es dreht sich um ein Kontoverwaltungsprogramm. Girokonto, Sparkonto und Darlehnskonto erben von Kontostamm. Die Daten zu den Konten werden aus einer File eingelesen und bei der Instanziierung sollen in einem Dictionary abgelegt werden. Jedes Konto hat eine Funktion für den Buchungsvorgang, dessen Daten ebenfalls über die File kommen. Im Anschluss sollen bestimmte Felder der Objekte ausgegeben werden.
Mein Problem:
Ich bekomme keinen Zugriff auf die Felder und Funktionen der Objekte im Dictionary. Sprich, dass ich jetzt einzelne Felder ausgeben kann oder die Funktion buchungsvorgang() ansprechen kann.
Projektmappe:
Habe die Mappe hier hochgeladen, da es einige Klassen sind und ich mir denke, dass es so besser zu lesen ist.
abstract class KontoStamm {
public static Dictionary<int, object> Konten = new Dictionary<int, object>();
// ----------------------------------------------------------------------------------
public List<Buchung> _buchungen = new List<Buchung>();
public DateTime _Datum { get; protected set; }
public string _Art { get; protected set; }
public string _KontoInhaber { get; protected set; }
public int _Kontonr { get; protected set; }
public double _Saldo { get; protected set; }
// -----------------------------------------------------------------------------------
public KontoStamm(int kontonr,string kontoInhaber) {
this._Datum = DateTime.Now;
this._Kontonr = kontonr;
this._KontoInhaber = kontoInhaber;
this._Saldo = 0;
}
}
class Girokonto : KontoStamm {
public double _dispo { get; private set; }
public double _sollzins { get; private set; }
// ------------------------------------------
public Girokonto(int kontonr, string kontoInhaber, double dispo, double sollzins):base(kontonr, kontoInhaber) {
this._Art = "Girokonto";
this._dispo = dispo;
this._sollzins = sollzins;
KontoStamm.Konten.Add(kontonr, this);
}
// ------------------------------------------
public void buchungsvorgang(double betrag) {
if (_dispo > (_Saldo + betrag)) {
_Saldo += betrag;
_buchungen.Add(new Buchung(betrag, DateTime.Now));
} else {
Console.WriteLine("Fehler");
}
}
}
static void Main(string[] args) {
using (StreamReader reader = new StreamReader(Environment.CurrentDirectory + @"\Daten.txt")) {
string zeile;
while ((zeile = reader.ReadLine()) != null) {
string[] tab = zeile.Split(';');
switch (tab[0].ToLower()) {
case "neuesgirokonto":
new Girokonto(Convert.ToInt32(tab[1]), tab[2], Convert.ToDouble(tab[3]), Convert.ToDouble(tab[4]));
break;
case "neuesdarlehenskonto":
new Darlehenskonto(Convert.ToInt32(tab[1]), tab[2], Convert.ToDouble(tab[3]));
break;
case "neuessparkonto":
new Sparkonto(Convert.ToInt32(tab[1]),tab[2],Convert.ToDouble(tab[3]) ,Convert.ToDateTime(tab[4]), Convert.ToDouble(tab[5]));
break;
case "buchung":
// buchungsvorgang
break;
}
}
reader.Close();
}
// Testausgabe
foreach (KeyValuePair<int, object> item in KontoStamm.Konten) {
Console.WriteLine("Key = {0}, Value = {1}", item.Key, item.Value);
}
Console.ReadKey();
}
Best regards
Mx
Link auf externen Filehoster und Projekt im Anhang entfernt. Bitte keine kompletten Projekte posten! Bitte beachte zukünftig [Hinweis] Wie poste ich richtig?
Hallo und willkommen,
das liegt daran, daß du die Daten als object
in das Dictionary
einträgst.
Wäre es nicht sinnvoller, KontoStamm
zu verwenden? So kommst du zumindestens schon mal direkt an die Eigenschaften davon heran.
Wenn du jedoch dann auf die Eigenschaften der abgeleiteten Klassen zugreifen möchtest, dann mußt du entsprechend 'casten', s.a. [FAQ] Casten aber richtig: () / is / as.
Edit: bzw. virtuelle Eigenschaften/Methoden in der Basisklasse zur Verfügung stellen.
PS: Auch wenn Kontonummer wie eine Zahl erscheint ist es jedoch keine (man rechnet ja nicht damit), daher wäre string
die passende Repräsentation dafür.
Und auch bei der Benennung z.B. der Eigenschaften solltest du dich an die C#-Namenskonvention halten, d.h. keine führenden Unterstriche (diese sind eher für private Member vorgesehen).
Moin,
ah danke, habs hinbekommen und die Felder abgeändert nach deinem Vorschlag.
Best regards