Entwickler-Ecke
Basistechnologien - [Einsteiger] Verschachtelte Klassen & Werteaustausch
miniC# - So 09.11.08 23:07
Titel: [Einsteiger] Verschachtelte Klassen & Werteaustausch
Hi,
ich bin ganz neu in C# und habe ein Frage zu *Nested Classes*. Sollte ich damit altebekannte Themen anschneiden , Asche auf mein Haupt. Meine Netzsuche zu dem Thema war ausführlich, aber leider nur bedingt erfolgreich.
Situation
Ich möchte eine Klasse erstellen , die eine Farbe darstellt. Die Unterklassen stellen jeweils einen Farbraum dar. Jeder Farbraum enthält schreib und lesbare Farbkanäle. Die Hauptklasse enthält einen privaten RGB-satz, der zum Umrechnen und speichern der Farbe genutzt wird.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Public class color { Private double cr,cg,cb;
Public class rgb { Private double r,g,b; }
Public class hsv { Private double h,s,v; }
Public class cmyk { Private double c,m,y,k; } } |
Dabei sollen alle errechenbaren Werte gesetzt werden , so dass sich folgendes Verhalten ergibt :
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Private Color myColor = new Color(); Private double Hue = 0; Private double Red = 0;
myColor.RGB.Set(255,125,255); Hue = myColor.HSV.H; Red = myColor.RGB.R;
|
Problem
Mein Problem ist nun der Werteaustausch zwischen der Haupt und den Unterklassen. Die Hauptklasse enthält die privaten Doubles cr,cg und cb mit denen zwischen den Farbräumen umgerechnet werden soll.
Möchte ich nun von Color.HSV auf die Werte cr,cg,cb von Color zugreifen, so müsste ich diese als Static deklarieren , was natürlich nicht geht, da ich mehr als einen Farbwert speichern können möchte. Außerdem bereitet mir die Limitation des Schlüsselwortes this Probleme, bzw die Verknüpfung der Hauptklasse mit den nested classes.
Lösungsansatz
Mein Lösungsansatz ist folgender (stark zusammengefasst) :
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:
| public class Color { public double r, g, b; public Color(double xr, double xg, double xb) { r = xr; g = xg; b = xb; } public class RGBpercent { private Color _cl; private double rp, gp, bp; public RGBpercent(Color cl) { _cl = cl; rp = _cl.r / 2.55; gp = _cl.g / 2.55; bp = _cl.b / 2.55; } public double _rp { get {return rp;} set {rp = value;} } } public double rPercent { get { RGBpercent me = new RGBpercent(this); return me._rp ; } set { RGBpercent me = new RGBpercent(this); me._rp = value; } } } |
Problem ist jedoch die 1-dimensionale Struktur (Problem Kanaldoubletten und Unübersichtlichkeit), sowie generell sehr schwerfälliger Code. Wie mache ich das besser ?
Vielen Dank für Eure Antworten im Vorraus.
Gruß,
minime
Moderiert von
Christian S.: Überflüssige Zeilenumbrüche entfernt
Christian S. - Mo 10.11.08 00:34
Hallo!
Dein letzter Ansatz geht für das, was Du machen willst, schon in die richtige Richtung. Du kannst aber noch ausnutzen, dass die verschachtelte Klasse auch auf private Member der übergeordneten Klasse zugreifen kann:
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:
| class Color { private double r; private double g; private double b;
private Rgb rgb;
public Color() { rgb = new Rgb(this); }
public Rgb RGB { get { return rgb; } }
#region Nested classes public class Rgb { private Color parent; public Rgb(Color Parent) { this.parent = Parent; }
public double R { get { return parent.r; } set { parent.r = R; } } } #endregion } |
Grüße
Christian
//edit: P.S.: :welcome: im Forum!
miniC# - Mo 10.11.08 01:28
hallo vielen dank für deine umfangreichen antwort. ich muss , dass erstmal verarbeiten :) ...
Christian S. - Mo 10.11.08 01:34
Wenn Du Fragen hast, dann sag Bescheid :-)
Im Wesentlichen wird jeder Zugriff auf die Felder von Color durch einen Instanz von Rgb geleitet. So hat man die Möglichkeit, die Werte entsprechend anzupassen / zu konvertieren.
miniC# - Mo 10.11.08 01:56
hm , wenn ich dein beispiel verwende, dann bekomme ich folgende fehlermeldung :
in einer anderen klasse :
C#-Quelltext
1:
| public Color x = new Color(); |
-> Inkonsistenter Zugriff: Feldtyp "WindowsFormsApplication1.Color" ist weniger zugreifbar als Feld
deklariere ich die class color als public, kompiliert er zwar brav, aber wenn :
C#-Quelltext
1: 2:
| public Color x = new Color(); x.rgb.r = 125; |
dann ist ?X.rgb.r = 0 beim debuggen ???? ich bin irgendwie zu blöd ...
Christian S. - Mo 10.11.08 02:01
Zuerst einmal musst Du vorsichtig sein: Es gibt auch im Framework eine Color-Klasse! Du kannst über Angabe des Namespace sicherstellen, dass die richtige Klasse verwendet wird - oder Deine Klasse umbenennen ;-)
Die Klasse als
public zu deklarieren ist sicherlich nicht falsch.
Auf
rgb (klein geschrieben) solltest Du außerhalb der Klasse eigetnlich gar keinen Zugriff haben, sondern nur auf
RGB, denn das ist die öffentliche Property. Zeig doch mal ein bisschen mehr Code :-)
//edit: :autsch: Da ist natürlich noch ein Fehler drin. Der Setter in der verschachtelten Klasse muss natürlich so aussehen:
miniC# - Mo 10.11.08 02:09
1. system.drawing hatte ich nicht importiert :)
2. hätte ich auch selbst drauf kommen , können :)
dank dir vielmals, schaut alles sehr gut aus , werde mich jetzt erstmal dranmachen , dass im großen rahmen umzusetzen .
miniC# - Mo 10.11.08 08:55
es läuft ;)
dank dir vielmals für deine mühe und hilfe.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!