Laden...

Wie kann ich Werte per Referenz in eine andere Klasse übergeben?

Erstellt von ayykaramba vor 3 Jahren Letzter Beitrag vor 3 Jahren 685 Views
A
ayykaramba Themenstarter:in
10 Beiträge seit 2020
vor 3 Jahren
Wie kann ich Werte per Referenz in eine andere Klasse übergeben?

Hallo zusammen,

ich bin gerade dabei mich mit einem Fachbuch in C# einzuarbeiten und mache gerade ein Übungsprojekt in dem ich Tetris programmieren möchte. Ich habe Probleme mit dem übergeben per Referenz von Variablen. Im Fachbuch ist ein Beispiel das innerhalb der gleichen Klasse funktioniert, aber wie verhält sich das, wenn ich den Wert in eine andere Klasse übergebe?

Ich habe die Klasse Form1 und die Klasse Bausteinform1. Nun möchte ich in Form1 die Methode erstellen() von Bausteinform1 aufrufen und hierbei eine Variable aus Form1 mitliefern. Diese Variable wird in der Methode erstellen() verändert und der veränderte Wert soll nun auch für die Originalvariable von Form1 gelten.

Im folgenden ist eine vereinfachte Darstellung wie ich es probiert habe. Mit einem return möchte ich hier nicht arbeiten, da ich nicht nur int variablen verändern möchte sondern auch panels mitliefere.

public partial class Form1:Form
{
public int variable = 0;

Bausteinform1 neueBausteinform1 = new Bausteinform1();
neueBausteinform1.erstellen(ref variable);
}

class Bausteinform1:Form1
{


public void erstellen(int variable)
{
variable++;
}
}

Kann mir jemand sagen was ich falsch mache?
Es wird mir der Fehler "Das Argument 1 kann nicht mit dem Schlüsselwort "ref" übergeben werden"

4.931 Beiträge seit 2008
vor 3 Jahren

Hallo und willkommen,

dazu mußt du auch bei dem Methodenparameter ref voranstellen, damit klar ist, daß du auch ref beim Aufruf angeben mußt:


public void erstellen(ref int variable)

(selbiges gilt auch analog für out-Parameter).

PS: Soll Bausteinform1 wirklich eine eigenständige Form-Klasse sein (weil du davon erbst)? Ein Tetris-Baustein ist doch nur ein Control (z.B. ein Panel, PictureBox o.ä.).

PPS: Und bitte packe deinen Code in passende Code-Tags (mit dem c#-Button).

5.657 Beiträge seit 2006
vor 3 Jahren

Weeks of programming can save you hours of planning

A
ayykaramba Themenstarter:in
10 Beiträge seit 2020
vor 3 Jahren

danke dir. Das ist wohl der Unterschied zur Referenz innerhalb einer Klasse!

zu deinem PS:
Meine Tetris Bausteine bestehen aus jeweils 4 gleich großen Panels die je nach Bausteinform anders angeordnet sind (wie beim originalen Tetris). Der Grund warum ich eine Vererbung hier gemacht habe ist, dass ich nach Initialisierung der Panel Eigenschaften (Location, Size) in Bausteinform1 die Panels zu Controls von Form1 hinzufügen möchte.

Control.Add(p0); 
Control.Add(p1);
Control.Add(p2);
Control.Add(p3);

ohne die Vererbung hat das bei mir nicht geklappt. Auch nicht mit Form1.Controls.Add(p0);
Aber das vermutlich wieder ein Anfängerfehler von mir? Was spricht denn gegen eine Vererbung hier?

4.931 Beiträge seit 2008
vor 3 Jahren

Vererbung ja, aber eben nicht von Form (das stellt ja ein komplett eigenständiges Fenster mit Rahmen und Titelleiste dar), sondern von eines der Controls (also z.B. Panel, wenn du die Bausteine selber zeichnen möchtest, wie in [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox) beschrieben).