Laden...

Reference im Konstruktor

Erstellt von Muphin vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.270 Views
M
Muphin Themenstarter:in
174 Beiträge seit 2006
vor 16 Jahren
Reference im Konstruktor

Ich hab eine übergeordnete Klasse die einen bool Member m_loesenPressed und ein Member Array aus einer anderen Klasse "Feld" hat. Im Konstruktor der übergeordneten Klasse wird dann das Array der Felder initialisiert und ich übergebe den bool Member als ref, damit bei einer änderung des bools in einem der Felder ich die Änderung auch in der übergeordneten Klasse mitbekomme. Allerdings funktioniert das nicht, der bool wird für jedes Feld getrennt behandelt und es läuft nicht so wie ich mir das gedacht hab, das es also praktisch nur ein einziges m_loesenPressed gibt und sobald sich das irgendwo ändert ich das auch an allen anderen Stellen mitbekomme. Es ist also eher so als würde ich den bool by value übergeben.

Edit:
Ich hab daneben noch eine eigene Klasse Colors von der ich eine Instanz genauso benutze, damit ich in den einzelnen Feldern und in der übergeordneten Klasse die selben Farbe zur Hand hab und mit der funktioniert das wunderbar.


public class1
{
   ...
   private Feld[,] m_fields;
   private bool m_loesenPressed;
   private Colors m_colors;
   ...

   public class1
   {
     ...
         for( int i = 0; i < 9; i++ )
         {
            for( int j = 0; j < 9; j++ )
            {
               m_fields[i, j] = new Feld( ref m_colors, ref m_loesenPressed );
            }
        }
       ...
   }
...

public class Feld
{
      ...
      private bool m_loesenPressed;
      private Colors m_colors;
      ...

      public Feld( ref bool t_loesenPressed )
      {
         ...
         m_loesenPressed = t_loesenPressed;
         m_colors = t_colors;
         ...
      }

     ...

      private void hauptfeld_TextChanged( object sender, System.EventArgs e )
      {
         m_loesenPressed = false;
      }
}

998 Beiträge seit 2007
vor 16 Jahren

public Feld( ref bool t_loesenPressed )
      {
         ...
         m_loesenPressed = t_loesenPressed;
         ...
      }

bool ist doch eine Wertetyp, kannst du dem überhaupt so ohne weiteres eine Referenz zuweisen auf die er dann zeigt?

Kann es sein das er bei der zuweisung implizit den Wert kopiert anstatt die Referenz zuzuweisen?

G
58 Beiträge seit 2007
vor 16 Jahren

Hallo Muphin,
Probier mal

private ref bool m_loesenPressed;

Sonst wird der Wert auf jeden Fall kopiert, wie DavidT schon geschrieben hat.

Grolli

998 Beiträge seit 2007
vor 16 Jahren

Versuch mal den Bool-Wert in einer Klasse zu kapseln damit du mit einem Referenztyp arbeiten kannst, z.B. so:


public class boolZgr
{
  public bool value;
};

Dann nimmst du boolZgr als Parametertyp und so hast du überall denselben, auch wenn du ihn einem Attribut zuweist.

P.S.: Grad seh ich Grollicus's Lösung, wenn das so auch geht ist das natürlich noch besser g

M
Muphin Themenstarter:in
174 Beiträge seit 2006
vor 16 Jahren

Danke für die Tipps!
Das funktioniert leider nich:

   
public class Feld
   {
      private ref bool m_loesenPressed;
   

Also bleibt mir wohl nur eine eigene bool Klasse!
Oder hat noch jemand ne andere Idee wie man das Problem lösen kann?

gruß Muphin

998 Beiträge seit 2007
vor 16 Jahren

Du könntest auf unsafe code umsteigen und dann mit Zeigern arbeiten aber das kann man dir wohl nicht ernsthaft raten... g

Kannst es ja als private inline-klasse machen damit es nach aussen nach einem sauberen Design aussieht g

S
8.746 Beiträge seit 2005
vor 16 Jahren

Der ganze Ansatz ist Quark. Änderungsbenachrichtigung macht man per Events bzw. per Delegate.