Laden...

"Private" Felder nur für die dazugehörige Klasse?

Erstellt von cyanide vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.798 Views
C
cyanide Themenstarter:in
88 Beiträge seit 2008
vor 13 Jahren
"Private" Felder nur für die dazugehörige Klasse?

Moin!

Ich habe eine Form, eine Hauptklasse und eine Hilfsklasse für die Hauptklasse.

Die Hilfsklasse enthält Felder und Eigenschaften für die Felder.

Meine Form enthält eine Instanz der Hauptklasse und letztere wiederrum eine Instanz der Helferklasse.

Ist es mir möglich, die Felder meiner Helferklasse der Hauptklasse sichtbar zu machen, während ich in meiner Form nur auf die Eigenschaften der Hilfsklasse Zugriff habe?

Grund: In meiner Hauptklasse setzte ich überhaupt erst Werte für die Helferklasse, sodass ich Schreibzugriff haben muss. In meiner Form sollen aber wie gesagt die Eigenschaften verwendet werden..

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

ich denke du solltest den Entwurf nochmals überdenken, es sind einfach zuviele Abhängikeiten drin. Es ist ja beim Lesen schon schwer da noch zu folgen...

BTW: Gibt die Hilfsklasse und die Hauptklasse in eine eigene Assembly dann kann mit internal dieser Zugriff gesteuert werden. Die Eigenschaften sind public.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo cyanide,

eine geschachtelt Klasse (nested class) hat Zugriff auf die privaten Member der äußeren Klasse.

Ansonsten kann man über Interfaces erreichen, dass den Verwendern nur die lesenden Operationen einer Klasse zur Verfügung gestellt werden.

herbivore

C
cyanide Themenstarter:in
88 Beiträge seit 2008
vor 13 Jahren

Moin!

Erstmal vielen Dank für eure Antworten. Wenn mein Text wirklich so unleserlich war, schreib ich hier mal kurz ein Beispiel, wie ich es meine:

Helferklasse:

    public class RawEventArgs : EventArgs
    {
        internal RawCommand rawCommand = null; // Soll nur für die Hauptklasse sichtbar sein.
        internal bool performDefault = true;

        public RawCommand RawCommand
        {
            get { return rawCommand; }
        }

        public bool PerformDefault
        {
            get { return performDefault; }
            set { performDefault = value; }
        }
    }
}

in diesem Fall einfach eine EventArgsklasse die meine Hauptklasse erst "befüllt", dabei soll nach außenhin (FormKlasse) "rawCommand" nicht verändert werden können, da die Hauptklasse damit evtl. nochmal weiterarbeitet.

Hauptklasse:

    public class MainClass
    {
        public delegate void RawEventHandler(object sender, RawEventArgs e);
        public event RawEventHandler Raw;

        private void DoRead()
        {
            byte[] buffer = new byte[bufferSize];
            int bytesRead = 0;
            BufferParser bufferParser = new BufferParser();
            RawCommandParser rawCommandParser = new RawCommandParser();

            while ((bytesRead = networkStream.Read(buffer, 0, bufferSize)) != 0)
            {
                bufferParser.Add(buffer, bytesRead);

                while (bufferParser.RawCommandAvailable())
                    HandleRawCommand(rawCommandParser.Parse(bufferParser.GetRawCommand()));
            }
        }

        /// <summary>
        /// Handles the overgiven RawCommand.
        /// </summary>
        /// <param name="rawCommand">Contains the prefix, the command and its parameters.</param>
        private void HandleRawCommand(RawCommand rawCommand)
        {
            RawEventArgs rea = new RawEventArgs();

            if (Raw != null)
            {
                // Hier beschreibe ich die EventArgs
                rea.rawCommand = rawCommand;

                Raw(this, rea); // und hiernach arbeite ich damit weiter s.u.
            }

            if (rea.performDefault)
            {
                switch (rawCommand.command.ToLower())
                {
                    case "blubb":
                        {

                        }
                        break;
                  }
             }
         // usw.

Meine Frage ist nun, ob ich wirklich jede von EventArgs abgeleitete Klasse als nested class in meiner Hauptklasse haben sollte? Ich finde es schöner jede Klasse und sei sie noch so klein, in einer extra Datei zu haben. Geht das nicht auch irgendwie? Denn EventArg'klassen habe ich recht viele..

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo cyanide,

ich würde das einfach über einen Konstruktor mit den entsprechenden Parametern lösen. Die Properties können dann alle readonly sein.

herbivore

C
cyanide Themenstarter:in
88 Beiträge seit 2008
vor 13 Jahren

Moin herbivore,

danke erstmal für deine Antwort.

Wie ist es denn aber, wenn meine Hauptklasse in der Helferklasse noch einen Wert verändern müsste?

Gegeben seien 3 Klassen:

Form1
MainClass
SubClass

SubClass enthält nun ein Feld namens "blubb", dieser soll aber nur von MainClass beschrieben werden dürfen, nicht aber von Form1.

Wie löse ich soetwas? Das Problem habe ich überall.

Klar, ich könnte die ganzen Klassen in eine Assembly packen und dann internal.. aber das möchte ich ja auch nicht..

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo cyanide,

aus meiner Sicht wurden alle Möglichkeiten genannt.

herbivore

916 Beiträge seit 2008
vor 13 Jahren

Schau noch mal genau hin.

eine geschachtelt Klasse (nested class) hat Zugriff auf die privaten Member der äußeren Klasse.

Ansonsten kann man über Interfaces erreichen, dass den Verwendern nur die lesenden Operationen einer Klasse zur Verfügung gestellt werden.

Konstruktor mit den entsprechenden Parametern

Again what learned...