C# Klassen?

2 Antworten

Auf diese Weise bekommt der Konstruktor der Klasse Steuerung das aufrufende Objekt der Klasse GUI übergeben.

Bei der Erstellung der Klasse GUI wird über diesen Konstruktor ein neues Objekt der Klasse Steuerung angelegt. Dieses Objekt ist dem GUI-Objekt über die Variable dieSteuerung bekannt.

Durch das Übergeben des GUI-Objekts (this) kennt auch die Steuerung ihrerseits wieder die GUI. So kann in beide Richtungen kommuniziert werden.

Um zu wissen wie die GUI dann in der Steuerung verwendet wird, musst Du in die Klasse Steuerung reinschauen.

Dort gibt es einen Konstruktor Steuerung(GUI <variablenname>). Ich vermute, dass es in der Klasse Steuerung auch eine Variable vom Typ GUI gibt, die in diesem Konstruktor gesetzt wird. Dann musst Du nachschauen, was mit dieser Variablen gemacht wird. Ansonsten eben schauen, was in diesem Konstruktor mit der Variablen <variablenname> geschieht.

Wenn das dann unklar ist, kannst Du ja nochmal den Code der Klasse Steuerung hier posten.

Wobei es da immer schön wäre, man hätte das auch als Text und nicht nur als Bild ;)

Das Schlüsselwort this verweist stets auf das aufrufende Objekt.

Angenommen, du hast diese Klasse:

class Dog {
  private bool isHungry = true;

  public void Eat()
  {
    this.isHungry = false;
  }
}

und dazu wird nun ein Objekt erstellt, welches die Eat-Methode aufruft:

Dog odie = new Dog();
odie.Eat();

Dann verweist this innerhalb der Eat-Methode auf das Objekt odie. Es wird also das Feld von odie verändert (isHungry).

Du könntest dir den Aufruf und die Funktionsdeklaration auch folgendermaßen vorstellen:

public void Eat(Dog this)
{
  this.isHungry = false;
}

// call:
Eat(odie);

Im Grunde spielt sich dieses Vorgehen hinter den Kulissen ab.

Das Schlüsselwort this kann immer nur in einem objektgebundenen Kontext (also nie in statischen Code-Blöcken, wie statische Methoden, Properties, Konstruktoren, ...) benutzt werden. Des Weiteren ist es nicht zwingend notwendig, es bei Zugriff au Properties, Methoden, u.ä. zu schreiben. Das heißt, der Zugriff auf isHungry klappt auch so:

public void Eat()
{
  isHungry = false;
}

Fast unvermeidbar wird sein Einsatz bei Namenskollisionen:

public void UpdateHungryStatus(bool isHungry)
{
  this.isHungry = isHungry;
}

In deinem Fall gibst du das aufrufende Objekt an ein Stuerung-Objekt weiter. Dieses kann dann mit der Referenz weiterarbeiten. Übertragen auf mein obiges Beispiel, könnte man sich so etwas zurechtbasteln:

class Dog {
  private bool isHungry = true;

  public Dog(Owner owner)
  {
    owner.Dog = this;
  }
          
  public void Eat()
  {
    this.isHungry = false;
  }
}

class Owner
{
  public Dog Dog { get; set; }

  public void RequestToEat()
  {
    if (Dog != null)
    {
      Dog.Eat();
    }
  }
}                     

// Main:
Owner jon = new Owner();
Dog odie = new Dog(jon);
jon.RequestToEat();

Beim Anlegen der Hundeinstanz wird dieser ihr Herrchen übergeben. Das Herrchen wiederum hat ein Property, welches eine Referenz zu seinem Hund darstellt. Mit

owner.Dog = this; 

verweist es künftig auf das Objekt odie. Also ist odie der Hund von Besitzer jon. Über die Referenz kann er seinem Hund dazu auffordern, zu essen.