Windows Forms: Warum kann ich kein public Array erstellen, in dem Objekte gespeichert sind?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Offensichtlich hast du ungefähr so einen Fall:

class SomeClass
{
  public string word = "Hello";

  public string sentence = word + " world!";
}

Beim Initialisieren eines Feldes greifst du auf einen Wert zu, der zu diesem Zeitpunkt noch nicht existiert.

Die Lösung ist ziemlich einfach: Verwende einen Konstruktor für die Definition:

class SomeClass
{
  public string word = "Hello";

  public string sentence;

  public SomeClass()
  {
    sentence = word + " world!";
  }
}

Alternativ könnte die Definition auch innerhalb des Kontexts einer objektgebundenen Methode / eines objektgebundenen Properties erfolgen. Dann müsstest du allerdings auch sicherstellen, dass diese/s aufgerufen wird, bevor du das Feld verwendest, welches du mit einem Wert ausstatten wolltest.

Hallo, wie kann ich ein von überall zugängliches Array erstellen, welches Objektinstanzen der Windows Forms Klasse speichert?

Du sprichst von einer globalen Variable. Das ist generell etwas, was du vermeiden solltest, da du somit Kontrolle abgibst (die Änderungen des Arrays sind nicht mehr so gut nachverfolgbar). Deshalb ist es auch ein erklärtes Ziel der OOP (der auch C# folgt), globale Variablen möglichst abzuschaffen.

Bau dir stattdessen doch ein Manager-Objekt:

public class FormManager
{
  private readonly IList<Form> _forms;

  public FormManager()
  {
    _forms = new List<Form>();
  }

  public void Register(Form form)
  {
    _forms.Add(form);
  }

  public void Unregister(Form form)
  {
    _forms.Remove(form);
  }
}                            

Dieses verwaltet eine Liste. Falls immer wieder Form-Objekte hinzugefügt werden sollen (also eine unbestimmte Anzahl), wäre sie gegenüber einem Array flexibler.

Die Un-/Register-Methoden erscheinen derzeit noch karg. Sie bieten noch Platz für individuelle Prüfungen oder dergleichen, falls es so etwas braucht.

Get-Methoden fehlen ebenso noch. Die kannst du dir selbst ergänzen.

Zu Programmbeginn kannst du dir dein FormManager-Objekt anlegen und an die Methoden / Objekte verteilen, die darauf zugreifen sollen. Die Übergabe erfolgt als Argument.

Beispiel:

class FormJunkie
{
  private readonly FormManager _dealer;

  public FormJunkie(FormManager dealer)
  {
    _dealer = dealer;
  }

  public void Consume()
  {
    Form form = _dealer.GetForm(); // call some Get method
    // do something with form ...
  }
}

// Main:
FormManager manager = new FormManager();
FormJunkie junkie = new FormJunkie(manager);
junkie.Consume();

Wegen der Kapselung von C++ Klassen. Das ist schlechter Programmierstil. Wenn du es dennoch willst musst du in die Trickkiste greifen und schon ein fortgeschrittener sein.


VielFrager42 
Fragesteller
 10.07.2021, 18:40

Danke, ich habe es jetzt einfach so gelöst dass ich dass Array (als public) außerhalb der Forms-Klasse deklariere, und dann darin initialisiere. Der Programmierstil ist schlecht, ich weiß, aber momentan sehe ich leider keine andere Möglichkeit das gezielte Ergebnis zu bekommen...

0