Laden...

[Solved] Zugriff auf Objektefelder und -funktionen in einem Dictionary

Erstellt von mxt vor 3 Jahren Letzter Beitrag vor 3 Jahren 636 Views
M
mxt Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren
[Solved] Zugriff auf Objektefelder und -funktionen in einem Dictionary

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

Hinweis von MrSparkle vor 3 Jahren

Link auf externen Filehoster und Projekt im Anhang entfernt. Bitte keine kompletten Projekte posten! Bitte beachte zukünftig [Hinweis] Wie poste ich richtig?

4.931 Beiträge seit 2008
vor 3 Jahren

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).

M
mxt Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren

Moin,

ah danke, habs hinbekommen und die Felder abgeändert nach deinem Vorschlag.

Best regards