Entwickler-Ecke

Basistechnologien - in einer Liste (List) verschiedene Objekte verwalten?


Foxi23 - Fr 29.01.10 18:59
Titel: in einer Liste (List) verschiedene Objekte verwalten?
Hallo,
Ich möchte ein Programm schreiben, daß Vectorgrafik enthalten soll.
Hierzu währe es günstig, wenn ich die verschiedenen Grafik-Objekte in einer Liste verwalten könnte. Meine Datenstruktur sieht etwa so aus:

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:
public class CGraficObjekt
    {
        protected int Objektart;
        protected Point p1, p2, p3, p4;
        protected int breite, hoehe;
        protected Pen linien = new Pen(Color.DarkGray);
        protected SolidBrush fuellungFarbe = new SolidBrush(Color.Red);
        protected long anfanszeit;
        protected int legende;
    }
    
    public class CLinie : CGraficObjekt
    {
        public int pfeil1, pfeil2; 
    }
    
    public class CFlaesche : CGraficObjekt
    {
        public Point TextEinfügepunkt;
        public enum EFlArt : byte { Rechteck = 0, Kreis, Dreieck , Elypse };
        public Font schrift = new Font("Arial"9); 
    }
    
    public class CText : CGraficObjekt
    {
        public int pfeil1, pfeil2;
        public Font schrift = new Font("Arial"9); 
    }
    
    public class CBild : CGraficObjekt
    {
        public Image bild;
    }
    
    public class CPolylinie : CGraficObjekt
    {
        public Point [] punkte = new Point [99];
    }

Also eine Basis-Classe und dann verschiedene Grafikobjekte, die von der Basis-Classe abgeleitet sind.
Frage: geht das, das man die in einer Liste verwalten kann.

Ich dachte mir so, aber das gibt eine Fehlermeldung

C#-Quelltext
1:
public static System.Collections.Generic.List<CLinie, CBild, CFlaesche, CPolylinie, CText> objektliste = new System.Collections.Generic.List<CLinie, CBild, CFlaesche, CPolylinie, CText>();                    

So das man beim einlesen das Feld Objektart ausliest, und dann mit der passenden Objekt-Classe weiter ausliest (Entschuldigung für das 3x lesen/liest)

Währe auch dankbar für einen Tipp, wenn ich hier einen völlig falschen "Ansatz" habe.

bis dann
Foxi23


JüTho - Fr 29.01.10 19:11

user profile iconFoxi23 hat folgendes geschrieben Zum zitierten Posting springen:
Also eine Basis-Classe und dann verschiedene Grafikobjekte, die von der Basis-Classe abgeleitet sind.
Frage: geht das, das man die in einer Liste verwalten kann.

Viel einfacher:

C#-Quelltext
1:
List<CGraficObjekt> list = new List<CGraficObjekt>();                    

Dann dürfen in diese Liste genau die CGraficObjekt-Instanzen sowie davon abgeleitete Instanzen eingetragen werden. Du hast lediglich das Problem, dass du bei Bedarf das jeweilige Objekt casten musst:

C#-Quelltext
1:
2:
CLinie line = list[23as CLinie;
if( line != null )  { ... }

Übrigens solltest du deine Bezeichnungen überprüfen: Grafic mit c, Objekt mit k, dazu das C am Anfang - so muss das nicht sein. Siehe NET Richtlinien für Namen [http://msdn.microsoft.com/de-de/library/ms229002(VS.80).aspx].

Gruß Jürgen


Foxi23 - Fr 29.01.10 19:28

Jürgen........ danke dir,


werden das gleich ausprobieren,

bis dann
der Eisenmann


JüTho - Fr 29.01.10 20:20

user profile iconFoxi23 hat folgendes geschrieben Zum zitierten Posting springen:
Jürgen........ danke dir,


werden das gleich ausprobieren,

bis dann
der Eisenmann

Verd..., hätte ich doch die Antwort von herbivore dort [http://www.mycsharp.de/wbb2/thread.php?threadid=81026] zuerst gelesen. Diese Doppel-Posts! Jürgen


Foxi23 - So 31.01.10 15:34

OK, Entschuldigung wegen dem Doppel-Post,
mach´s nicht wieder.
Ich hatte halt Panik gekriegt, bin nicht weiter gekommen.

Und wieder danke, jetzt klappt´s genauso wie ich das haben wollte.


bis dann Foxi23


Christian S. - So 31.01.10 16:03

Zur Info: Crossposts sind bei uns durchaus erlaubt, Du solltest halt nur auf den Thread im anderen Forum verlinken, damit sich niemand Arbeit mit einer Antwort macht, die woanders schon steht. :-)