Entwickler-Ecke

C# - Die Sprache - Problem bei Zugriff auf Array aus einer anderen Klasse


itchaas - Sa 17.11.12 00:26
Titel: Problem bei Zugriff auf Array aus einer anderen Klasse
Habe folgende Klasse DVD:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestbeispielDVD
{
    class DVD
    {
        private string titel;
        private int laufzeit;
        private int gesamtlaufzeit=0;
        private DVD[] array = new DVD[5];

        public DVD(string titel, int laufzeit)
        {
            this.titel = titel;
            this.laufzeit = laufzeit;
            
        }

        public string Titel
        {
            get { return titel; }
            set { titel = value; }

        }

        public int Laufzeit
        {
            get { return laufzeit; }
            set { laufzeit = value; }
        }


        public void Gesamtlaufzeit()
        {
            for (int i = 0; i < sammlung.Length; i++)
            {
                gesamtlaufzeit = gesamtlaufzeit + sammlung[i].laufzeit;
            }
            Console.WriteLine("Die Gesamtlaufzeit beträgt: " + gesamtlaufzeit);
        }

        public void Drucken()
        {
            Console.WriteLine("Der Titel heißt: {0}, Die Laufzeit dieser DVD ist {1}", titel, laufzeit);
            Console.WriteLine();
            Console.WriteLine("Gesamtlaufzeit derzeit: " + gesamtlaufzeit);
        }
    }
}


& die Mainmethode/Klasse


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
        static void Main(string[] args)
        {            
            DVD[] sammlung = new DVD[5];
            sammlung[0]=  new DVD("DVD1"320);
            sammlung[1] = new DVD("DVD2"420);
            sammlung[2] = new DVD("DVD3"520);
            sammlung[3] = new DVD("DVD4"520);
            sammlung[4] = new DVD("DVD5"620);

            for (int i = 0; i < sammlung.Length; i++)
            {
                sammlung[i].Drucken();
            }            
        }


Ich MUSS die Einzellaufzeit + die Gesamtlaufzeit ausgeben erhalte da aber einen Fehler
da dass array in der DVD Klasse nicht bekannt ist - wie löse ich dass ?

Danke!

Moderiert von user profile iconTh69: Titel geändert.


Palladin007 - Sa 17.11.12 00:51

Das Array "sammlung" in der Methode DVD.Gesamtlaufzeit() ist nicht bekannt, oder?


Das kannst du von dort nicht erreichen.
Das wäre auch unlogisch, da ein Objekt der Klasse DVD ja nur eine einzelne DVD darstellt und die anderen DVDs nicht kennt.
Die Anzahl DVDs kennt nur das Array selber.


Wenn du nun aber eine Methode haben willst, die die Anzahl berücksichtigt, musst du eine neue Klasse schreiben, die dann intern das Array verwaltet und so an die Anzahl kommt, oder du schreibst eine statische Methode, die dann ein DVD-Array verlangt.


itchaas - Sa 17.11.12 09:09

Hab das jetzt so gelöst - passt das oder geht das ohne Objekt oder schöner?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
class DVD
    {
        private string titel;
        private int laufzeit;
        private int gesamtlaufzeit=0;
        private int anzahldvds=0 ;
        private DVD[] sammlung = new DVD[5];

        public DVD(string titel, int laufzeit)
        {
            this.titel = titel;
            this.laufzeit = laufzeit;
            
        }

        public string Titel
        {
            get { return titel; }
            set { titel = value; }

        }

        public int Laufzeit
        {
            get { return laufzeit; }
            set { laufzeit = value; }
        }

        public void NewDVD(string titel, int laufzeit)
        {
            sammlung[anzahldvds] = new DVD(titel, laufzeit);
            anzahldvds++;
        }

        public void Gesamtlaufzeit()
        {
            for (int i = 0; i < sammlung.Length; i++)
            {
                gesamtlaufzeit = gesamtlaufzeit + sammlung[i].laufzeit;
            }
            Console.WriteLine("Die Gesamtlaufzeit beträgt: " + gesamtlaufzeit);
        }

        public void Drucken()
        {
            Console.WriteLine("Die Sammlung heißt: {0}", titel);
                                  
            
             for (int i = 0; i < anzahldvds; i++)
             {
                 Console.WriteLine("Diese beinhaltet folgende DVDs:" + sammlung[i].titel + " " + sammlung[i].laufzeit);
             }

             Console.WriteLine();
        }
    }


Testklasse:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
static void Main(string[] args)
        {
            DVD sammlung1 = new DVD("Meine DVD Sammlung"0);
            sammlung1.NewDVD("DVD1"620);

            sammlung1.Drucken();
            sammlung1.NewDVD("DVD2"520);
            sammlung1.NewDVD("DVD3"620);
            sammlung1.NewDVD("DVD4"720);
            sammlung1.NewDVD("DVD5"820);
            sammlung1.Drucken();
            sammlung1.Gesamtlaufzeit();
        }


Danke!


Th69 - Sa 17.11.12 11:01

Hallo itchaas,

du solltest dich schon entscheiden, was die Klasse DVD sein soll: Repräsentation genau einer DVD oder aber eine DVD-Sammlung? Aber nicht beides mischen.
Leg dir doch einfach eine zweite Klasse DVDSammlung an, in der du dann das Array DVD[] sammlung verwaltest und die dann die zugehörigen Methoden Gesamtlaufzeit() und Drucken() enthält.

P.S: Beitragstitel sinnvoller benannt ;-)


Palladin007 - Sa 17.11.12 12:37

Wie Th69 schon sagt, am sinnvollsten ist es, eine neue Klasse zu erstellen.
Die muss ja nicht sonderlich umfangreich sein, es reicht ja schon, die Liste in der Klasse nach außen hin zugänglich zu machen, dann brauchst du nur eine Eigenschaft und deine zwei Methoden.

Oder du machst es etwas schöner und erbst von ICollection<DVD> und baust dann deine beiden Methoden dazu.
Ob das so sinnvoll ist, musst du entscheiden.


itchaas - Sa 17.11.12 19:30

Jo, dass mit der Zweiten Klasse ist klar dass weis ich ja.

Aber es war eine Vorgabe seitens des Kursleiters... wahrscheinlich um uns zum grübeln zu bringen...

Darum meine Frage wie das aussehen könnte wenn man wirklich nur eine cs hätte...


Palladin007 - Sa 17.11.12 19:46

Du kannst es in einer cs haben, dann setzt du die zweite Klasse halt einfach darunter ^^

Also so:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
using Sytem;

namespace Namensraum
{
    class DVD
    {
        // Todo
    }

    class Sammlung
    {
        // Todo
    }
}


Das interessiert den Compiler kein Stück, solange du die Syntax bei behältst.