Forum: PC-Programmierung [C#] Generic Dictionary and Rectangle


von Thorsten (Gast)


Lesenswert?

Hallo, ich arbeite mich weiter in C# ein und komme bei meinem 
generischen Wörterbuch. In meiner Übung möchte ich mir eine Erweiterung 
für die Klasse Rectangle erstellen, damit ich später hoffentlich 
komfortabler die Daten an das Rechteck binden kann, dazu möchte ich das 
generische Wörterbuch benutzen.
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading.Tasks;
6
using System.Drawing;
7
8
namespace GenericDict
9
{
10
11
    public class MyRectangle
12
    {
13
        
14
        public MyRectangle(int id, string name, Rectangle rect, Color colour)
15
        {
16
            ID = id;
17
            Name = name;
18
            Rect = rect;
19
            Colour = colour;
20
            //Draw = draw
21
22
        }
23
24
        private int m_id;
25
26
        public int ID
27
        {
28
            get { return m_id; }
29
            set { m_id = value; }
30
        }
31
32
        private string m_name;
33
34
        public string Name
35
        {
36
            get { return m_name; }
37
            set { m_name = value; }
38
        }
39
   
40
                private Rectangle m_rect;
41
42
                public Rectangle Rect
43
                {
44
                    get { return m_rect; }
45
                    set { m_rect = value; }
46
                }
47
48
        private Color m_colour;
49
50
                public Color Colour
51
                {
52
                    get { return m_colour; }
53
                    set { m_colour = value; }
54
                }
55
       
56
    }
57
58
59
    class Program
60
    {
61
        static void Main(string[] args)
62
        {
63
64
65
            List<int> myInts = new List<int>();
66
67
            myInts.Add(1);
68
            myInts.Add(2);
69
            myInts.Add(3);
70
71
            for (int i = 0; i < myInts.Count; i++)
72
            {
73
                Console.WriteLine("MyInts: {0}", myInts[i]);
74
            }
75
76
            Dictionary<int, MyRectangle> MyRectangles = new Dictionary<int, MyRectangle>();
77
78
            MyRectangle rect1 = new MyRectangle(1, "Rect 1", Rectangle, Color.Green);             
79
           
80
            MyRectangles.Add(rect1.ID, rect1);
81
           
82
83
            foreach (KeyValuePair<int, MyRectangle> MyKeyVal in MyRectangles)
84
            {
85
                Console.WriteLine(
86
                    "My ID: {0}, Name: {1} Color: {2}",
87
                    MyKeyVal.Key,
88
                    MyKeyVal.Value.Name, MyKeyVal.Value.Colour);
89
            }
90
91
            Console.ReadKey();
92
        
93
        
94
        }
95
    }
96
}

Die Zeile mit dem erstellen des Eintrag macht mir Proleme. Name und 
Farbe funktioniert wunderbar, aber wie komme ich nun an die 
Eigenschaften vom Rechteck? Ich möchte die Position X, Y, Höhe, Breite 
verändern, aber ein Zugriff klappt nicht.
1
MyRectangle rect1 = new MyRectangle(1, "Rect 1", Rectangle.X.Value = 1, Color.Green);

Kann mir jemand ein Tipp geben?

von Dennis R. (dennis_r93)


Lesenswert?

Du erstellst erst ein neues Rechteck als separates Objekt mit deinen 
gewünschten Eigenschaften.
Dieses Rechteck übergibst du dann an den Konstruktor.

von Lang (Gast)


Lesenswert?

Wo erstellst du ein Objekt vom Typ Rectangle?
Und wo befüllst du dann dieses Objekt?

Bin ein bisschen raus auf C# und hab keine IDE hier, daher aus dem Bauch 
heraus:

Rectangle r = new Rectangle();
r.X.Value = blah;

MyRectangle rect1 = new MyRectangle(1, "Rect 1", r, Color.Green);

Und auf jeden Fall noch mit folgenden Beschäftigen:

Interfaces

Grundregel 1: Programming against an interface not an implementation!!!

von Thorsten (Gast)


Lesenswert?

Super, Vielen Dank, ohne ein Objekt vom Typ Rectangle wird es schwer was 
zu schreiben, jetzt klappt es.

Ok, die Sache mit den Interfaces kommt als nächstes dran.
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading.Tasks;
6
using System.Drawing;
7
8
namespace GenericDict
9
{
10
11
    public class MyRectangle
12
    {
13
        
14
        public MyRectangle(int id, string name, Rectangle rect, Color colour)
15
        {
16
            ID = id;
17
            Name = name;
18
            Rect = rect;
19
            Colour = colour;
20
            //Draw = draw
21
22
        }
23
24
        private int m_id;
25
26
        public int ID
27
        {
28
            get { return m_id; }
29
            set { m_id = value; }
30
        }
31
32
        private string m_name;
33
34
        public string Name
35
        {
36
            get { return m_name; }
37
            set { m_name = value; }
38
        }
39
   
40
                private Rectangle m_rect;
41
42
                public Rectangle Rect
43
                {
44
                    get { return m_rect; }
45
                    set { m_rect = value; }
46
                }
47
48
        private Color m_colour;
49
50
                public Color Colour
51
                {
52
                    get { return m_colour; }
53
                    set { m_colour = value; }
54
                }
55
       
56
    }
57
58
59
    class Program
60
    {
61
        static void Main(string[] args)
62
        {
63
64
65
            List<int> myInts = new List<int>();
66
67
            myInts.Add(1);
68
            myInts.Add(2);
69
            myInts.Add(3);
70
71
            for (int i = 0; i < myInts.Count; i++)
72
            {
73
                Console.WriteLine("MyInts: {0}", myInts[i]);
74
            }
75
76
            Dictionary<int, MyRectangle> MyRectangles = new Dictionary<int, MyRectangle>();
77
            Rectangle r = new Rectangle();
78
            r.X = 10;
79
            r.Y = 10;
80
            r.Height = 10;
81
            r.Width = 15;
82
83
            MyRectangle rect1 = new MyRectangle(1, "Rect 1", r,  Color.Green);             
84
           
85
            
86
87
            MyRectangles.Add(rect1.ID, rect1);
88
           
89
90
            foreach (KeyValuePair<int, MyRectangle> MyKeyVal in MyRectangles)
91
            {
92
                Console.WriteLine(
93
                    "My ID: {0}, Name: {1} Color: {2} Rect{3}",
94
                    MyKeyVal.Key,
95
                    MyKeyVal.Value.Name, MyKeyVal.Value.Colour,MyKeyVal.Value.Rect);
96
            }
97
98
            Console.ReadKey();
99
        
100
        
101
        }
102
    }
103
}

von Thorsten (Gast)


Lesenswert?

Hallo, ich hab mir nun viele Beispiele und Tutorials durchgelesen zu 
Interfaces. Ich bin mir noch etwas unsicher, ob ich den Wink auf 
Interfaces für meine Aufgabenstellung richtig verstanden hab.

Mit dem Interface kann ich mir neue Eigenschaften zur Rechteckklasse 
schaffen, wie z.B. eine ID, Farbe und Anzeige, wenn ich nun andere 
Geometrien wie Kreis, Elipse Dreieck, dann könnte ich die sehr leicht 
über das Interface mit den gleichen Eigenschaften meines Rechteckes 
generieren.

Stimmt soweit mein Verständnis?

von Lang (Gast)


Lesenswert?

Ja, im Grunde ist es wie mit dem Leben.

Ein Interface ist ein Vertrag. Die Grundlage eines jeden Handelns.
Mit dem Vertrag beschreibst du nur, was dein Objekt nachher können soll 
und nicht wie es das umsetzt.

Wie du schon sagtest, du definierst bspw. Farbe, Umfang, Fläche als 
Attribut in einem Interface. Dann muss deine Klasse später diese 
Attribute implementieren, wie genau, das ist dann Aufgabe der Klasse.

In einem generischen Dictionary kannst du dann alle Objekte ablegen, die 
deinem Vertrag entsprechen. Egal ob Kreis, Rechteck oder was auch immer. 
Denn dir ist beispielsweise nur wichtig, die Flächen zu haben.

Wenn man erstmal alles unter Vertrag gestellt hat, ist man bald sehr 
flexibler wenn es um Erweiterungen geht.

Daher auch bei einfachen Sachen erstmal angewöhnen einen Vertrag zu 
erstellen, dann geht das einem in Fleisch und Blut über und steht nicht 
mehr wie ein Ochs vorm Berg, wenn es komplizierter wird.

Gleiches gilt im übrigen auch im .NET Framework, dort gab/gibt es 
Interfaces wie bspw. IDictionary. Denn nach welchen Algorithmen nachher 
das Dictionary umgesetzt wird, ist erstmal egal.
Man kann dann bspw. bei Anwendungsstart in einer Factory ein Objekt 
welches IDictionary implementiert erstellen, je nachdem was man für 
einen Anwendungsfall hat. Die eine Umsetzung des Dictionary ist evtl. 
beim Füllen schneller, jedoch beim Auslesen langsamer, ein anderes genau 
anders herum.

Ich hoffe du erkennst die Vorteile von Schnittstellen (aber auch ein 
paar Nachteile wie erstmaliger Mehraufwand und etwas komplexer)

von Thorsten (Gast)


Lesenswert?

Hallo, danke für deine Antwort.

Ja der Mehraufwand ist erstmal gegeben, aber dafür schaffe ich so die 
Möglichkeit der Vielfachvererbung.

Ich fühle mich noch etwas unsicher, aber das Prinzip hab ich wohl 
verstanden. Etwas schwierig finde ich noch den Unterschied zwischen 
Abstrakte Klasse und Interfaces. In den Beispielen sehen Sie noch sehr 
identisch aus, deshalb hapert es noch etwas, trotzdem werde ich meine 
jetztige Klasse als Interface auslegen, damit ich mehr Erfahrung sammle 
und parallel die Möglichkeit erhalte besser das Interface zuerweiteren 
um nicht später nochmal alles neu zumachen.

von c# (Gast)


Lesenswert?

Meine persönliche Meinung:

Für Anfänger ist die Verwendung von Interfaces sinnlos und nur zu 
schreibender Mehraufwand. Der Einsatz von Interfaces ist erst sinnvoll 
und zwingend notwendig wenn man konsequent in der Anwendung auf einen DI 
Container wie zum Beispiel Autofac oder Ninject setzt. Ohne die 
Verwendung des Paradigmas Inversion of Control sollte man sich erstmal 
anderen Thematiken der Sprache C# zuwenden...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.