Announcement

Collapse
No announcement yet.

Ein Objekt in in mehreren Klassen gleichzeitig verwenden?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ein Objekt in in mehreren Klassen gleichzeitig verwenden?

    Hallo,
    Ich habe ein Hauptformular und ein zweites modales Form (Setup), das man aus dem Hauptform aufrufen kann. In diesem Setup kann ich einige Dinge einstellen, welche im Hauptform verwendet werde.
    Im Setup möchte ich diese Werte in einem Objekt schreiben und im Hauptform wieder auslesen. Im Prinzip möchte ich ein Objekt welches in Klasse 2 erzeugt wird, auch in Klasse 1 lesen und schreiben können. Nur leider sehe ich die Eigenschaften, und Methoden nicht in Klasse 1. Gibts da eine Möglichkeit, oder muss ich das in eine Datei schreiben um es woanders wieder auszulesen?
    Wie macht mans üblicherweise?

    Markus

  • #2
    Hallo,

    Vielleicht hilft dir dieser Ansatz weiter:
    Du erstellst eine eigene Klasse welche aus static properties besteht. Static deshalb, damit sie 1. nicht instanziert werden muessen und 2. sie sind innerhalb deiner App immer greifbar und ueberall gleich.

    Code:
    public sealed static class UsedEverywhere
    {
    private static string m_PropertyOne;
    public static string PropertyOne
    { 
        get { return m_PropertyOne;}
        set { m_PropertyOne = value;}
    }
    }
    Hier kannst du von Form1 und von FormX auf UsedEverywhere.PropertyOne zugreifen und wenn der Wert in FormX geaendert wird, kannst du diesen an alle anderen Forms oder was auch immer weitergeben (siehe INotifyPropertyChanged).

    HTH
    *-- robert.oh. --*

    Comment


    • #3
      Danke für die schnelle Antwort.
      Im Prinzip funktionierts, nur wie kann ich denn jetzt ein Array von Objekten dieser Klasse instanzieren? Muss dann wohl in der Klasse selbst für jedes Eigenschaft ein Array anlegen, oder nicht?!
      Das Programm soll 5 gleiche Geräte abfragen, wobei ich adresse , Com Baudrate, abfragezyklus und Einheit in das Objekt/Klasse schreibe und während der Abfragen soll dann mit den zugewiesenen Eigenschaften durch Indizes, der jeweils richtige Wert verwendet werden.
      Max

      Comment


      • #4
        Mein Vorschlag waere:

        - Erstellen einer Geraete-Klasse, welche die Properties (Baud Rate, Adresse, ...) enthaelt
        - in der gemeinsam genutzten Klasse eine Property (Generic) erstellen, zB public static Dictionary<string, GeraeteKlasse> Geraete { get; set;}
        - der Zugriff erfolgt dann ueber: GemeinsameKlasse.Geraete["Geraet1"]

        Der Vorteil vom Dictionary ist, dass du als ersten Parameter den Key / Geraetebezeichnung verwenden kannst und als zweiten Parameter die Klasse selbst.

        Entspricht das in etwa deinen Vorstellungen?
        *-- robert.oh. --*

        Comment


        • #5
          Das heißt ich erstelle meine Geräteklasse komplett mit allen Feldern, Methoden und Eigenschaften.
          Dann die Gemeinsame Klasse wo ich nur auf die Ursprungsklasse verweise oder wie kann ich auf eine Eigenschaft zugreifen? Oder muss ich mit dem get,set in der 2. Zeile die Datenkapselung in der GemeinsameKlasse machen.
          Wie würde das für die Baudrate aussehen?
          Dictionary<int,DeviceParameter>Baudrate{get;set;}
          Zugriff: GemeinsameKlasse.Baudrate[9600];
          Kann gerade nicht folgen.

          Comment


          • #6
            Eine Alternative zu static Properties wäre eine Singleton-Klasse. Das passt aber nur dann, wenn alle diese Einstellungen im Programm genau einmal zur Verfügung stehen sollen und überall gleich sein sollen.

            Im Übrigen stimme ich Roberts Vorschlägen voll und ganz zu. Jürgen

            PS. Eine Kurzinformation findest Du über Wikipedia: Singleton-Entwurfsmuster.

            PS 2: So geht der Zugriff:
            Code:
            GemeinsameKlasse.Geraete["Geraet1"].Baudrate = 9600;
            Aber Warnung: Wenn Du ein nicht vorhandenes Gerät angibst, knallt es; deshalb zuerst immer über ContainsKey() prüfen.

            Comment


            • #7
              Hallo,

              @Juergen: Danke

              @Max
              So ungefaehr koennte die initiale Zuweisung aussehen, vorausgesetzt du hast eine eigene Geraeteklasse mit allen Properties erstellt.

              Code:
              // init
               
              // geraet erstellen
              GeraeteKlasse geraet1 = new GeraeteKlasse();
              geraet1.Name = "Geraet 1";
              geraet1.Baudrate = 9600;
              // geraet zuweisen
              GemeinsameKlasse.Geraete.Add("Geraet 1", geraet1);
               
              // geraet erstellen
              GeraeteKlasse geraet2 = new GeraeteKlasse();
              geraet1.Name = "Geraet 2";
              geraet1.Baudrate = 4800;
              // geraet zuweisen
              GemeinsameKlasse.Geraete.Add("Geraet 2", geraet2);
               
              // geraet 2 abrufen
              if (GemeinsameKlasse.Geraete.ContainsKey("Geraet 2"))
              { 
                  GeraeteKlasse geraet = GemeinsameKlasse.Geraete["Geraet 2"];
                  geraet.Baudrate; // 4800
              }
              *-- robert.oh. --*

              Comment


              • #8
                Hallo,
                Steh ein wenig neben mir!
                Hab das ganze mal in einn Click Ereignis gepackt und div. Varianten probiert.


                public void button4_Click(object sender, EventArgs e)
                {
                DeviceParameter device1 = new DeviceParameter(); // in der Klasse habe ich DEVBezeichnung(string) und DEVBaudrate(int) definiert (siehe unten)

                GemeinsameDevPar.Device.Add("Device_1", device1); //Hier bekomme ich Verweis, dass Objekt nicht instanziert ist.


                DeviceParameter device = GemeinsameDevPar.Device["Device1"];

                GemeinsameDevPar.Device["Device_1"].DEVBezeichnung = "ODL1";

                }


                //gemeinsame Klasse in der ich auf DeviceParameter-Klasse verweise

                class GemeinsameDevPar
                {
                public static Dictionary<string, DeviceParameter> Device { get; set; }
                }


                //Klasse in der ich für jedes Gerät ein Objekt haben will

                public class DeviceParameter
                {
                string devBezeichnung, devProtokolltyp, devComPort;
                string devEinheit, devMWabfrage;
                int devBaudrate;

                public int DEVBaudrate
                {
                set { devBaudrate = value; }
                get { return devBaudrate; }
                }



                public string DEVBezeichnung
                {

                set
                {
                if (value.Length <= 10)
                devBezeichnung = value;
                else
                devBezeichnung = value.Substring(0, 10);
                }

                get { return devBezeichnung; }
                }


                }
                Wie kann ich das ganze dann über Arrays instanzieren.
                Das ganze sollte in Zukunft dynamisch während der Laufzeit, instanziert werden.
                Damit meine ich, keine Einschränkung der Geräteanzahl.
                Da muss ich ja über diverse Schleifen und dessen Laufvariable das gewünschte Objekt ansprechen.
                Vorerst muss ich aber nur 5 Geräte ansprechen, und dabei möchte ich es auch einmal belassen.

                Comment


                • #9
                  Wäre es nicht sauberer, wenn ich im Setupfenster meine Parameter in eine Binärdatei schreibe/ daraus lese, und im Hauptform instanziere ich ein eigenes ObjektArray neu und fülle die Objekte mit den Daten aus der Datei? Das Objektarray im Setupfenster hat ja nur den Sinn um es Objektmäßig speichern zu können. (mit Binwriter oder Binformatter) Die Einstellungen müssen sowieso in eine Datei und bei jedem Start der Anwendung im Hauptfenster automatisch geladen werden.

                  Comment


                  • #10
                    Hallo,

                    mir kommt es so vor, als wenn Du mehrere Möglichkeiten auf möglichst komplizierte Art verbinden willst. (Daran sind vielleicht auch Robert und ich schuld, weil wir Dir zu viele Möglichkeiten genannt haben.)

                    GemeinsameDevPar als eigene Klasse zu definieren, ist nur dann sinnvoll, wenn dies in mehreren getrennten Formularen genutzt werden soll. Dann darfst Du aber nicht nur ein Dictionary als static einbauen, sondern musst eine komplette Klasse einrichten. Bei Deinem Verfahren fehlt der Konstruktor des Dictionary; und es gibt (wegen der Verbindung static / non-static) auch keinen sinnvollen Weg.

                    Vorschlag: Benutze eine richtige Singleton-Klasse dafür; oder benutze das Dictionary direkt in der Formular-Klasse (ggf. mit Übergabe als Parameter in abhängige Formulare).

                    Das ganze in ein Click-Ereignis einzubauen, finde ich nicht schön; das ist zwar zum Probieren einfach, aber macht es später komplizierter. Besser ist es, gleich eigene Methoden zu machen und diese vom EventHandler aufzurufen.

                    Für die Klasse DeviceParameter schlage ich vor, einen oder mehrere public-Konstruktoren einzubauen, denen sofort notwendige Parameter (Name, Baudrate) übergeben werden.

                    Das Speichern der Daten in einer Datei hat damit wenig zu tun. Das geht auf jeden Fall mit Serialisierung; aber damit habe ich mich noch nicht beschäftigt. Das spricht wiederum für die Singleton-Klasse; deren Konstruktor steuert dann das Einlesen; wenn Du sie von IDisposable ableitest, kannst Du dort auch das Speichern einbauen.

                    Allgemeine Empfehlung: zuerst die Konstruktion planen, dann die Umsetzung in Code. (Aber das geht natürlich oft nicht; ich habe meine C/S-Anwendung etwa viermal vollständig neu konzipiert.)

                    Gruß Jürgen

                    Comment

                    Working...
                    X