Autor Beitrag
miniC#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: So 09.11.08 23:07 
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.

ausblenden 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 :

ausblenden 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;

// usw. usf ...


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

ausblenden volle Höhe 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 user profile iconChristian S.: Überflüssige Zeilenumbrüche entfernt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:

ausblenden volle Höhe 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!

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
miniC# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: Mo 10.11.08 01:28 
hallo vielen dank für deine umfangreichen antwort. ich muss , dass erstmal verarbeiten :) ...
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
miniC# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: Mo 10.11.08 01:56 
hm , wenn ich dein beispiel verwende, dann bekomme ich folgende fehlermeldung :

in einer anderen klasse :

ausblenden 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 :

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
parent.r = value;					

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
miniC# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: 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# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: Mo 10.11.08 08:55 
es läuft ;)

dank dir vielmals für deine mühe und hilfe.