C# Variable in anderer Klasse verwenden

5 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Hallo

Zunächst solltest du folgendes wissen:

Prinzipiell gibt es in Java (leider kann ich kein C#, aber ich weiß, dass es dort ähnlich wie in Java ist) drei verschiedene Arten von Variablen:

  • Klassenvariablen: Diese Variablen gibt es einmal in einer Klasse
  • Instanzvariablen: Jedes Objekt einer Klasse hat eine solche Variable
  • Lokale Variablen: Diese existieren nur in einer Methode

(Bei C++ gibt es dann noch Globalvariablen, die sich aber prinzipiell wie Klassenvariablen verhalten).

Bei den Variablen "breite" und "höhe" (erlaubt C# tatsächlich Umlaute in Variablennamen? - die meisten Programmiersprachen tun dies nicht) handelt es sich um Instanzvariablen. Das bedeutet, dass jedes Objekt vom Typ "Spielfeld" eine solche Variable hat. Beispiel:

Spielfeld s1=new Spielfeld();
Spielfeld s2=new Spielfeld();
Spielfeld s3=s2;

Es existieren jetzt die Variablen "s1.breite" und "s2.breite". "s2.breite" und "s3.breite" wäre die selbe Variable.

Auf diese Variablen greift man dann auch genau so zu:

int zahl1 = r.Next(0, s1.breite);

Vorausgesetzt, die Variable ist als "public" definiert (hier als Beispiel in Java, aber in C# wird es ähnlich sein):

public int breite;

Wenn du eine Klassenvariable erstellen willst, müsstest du in Java das Schlüsselwort "static" verwenden (in C# ist das meines Wissens auch "static", ich bin mir aber nicht sicher):

public static int breite;

In diesem Fall wird im gesamten Projekt genau eine Variable "Spielfeld.breite" angelegt, egal, wie viele Variablen vom Typ "Spielfeld" es gibt und egal, ob es überhaupt Variablen von diesem Typ gibt.

In Java könnte man dann folgendermaßen darauf zugreifen (wird in C# aber ganz ähnlich gehen):

int zahl1 = r.Next(0, Spielfeld.breite);

Donat47  10.10.2014, 13:54

kleine ergänzung dazu .. was in java getter und setter sind wird hier als accesor bezichnet und sieh so aus

int Zahl{
    get {return xxx;}
    set {Xxx;}
}
Woolli  10.10.2014, 08:49

sehr gute erklaerung!

TexasInstrumen 
Beitragsersteller
 10.10.2014, 11:50
@Woolli

Habe static gestern Nacht identisch angewendet aber Funktionieren wollte es nicht richtig und ich stellte hier die Frage. Heute klappt alles wunderbar, trotzdem vielen Dank :)

CSANecromancer  10.10.2014, 08:22

Ich möchte nur anmerken: Ja, in C# funktioniert das alles genau so wie beschrieben.

Hallo, in deinem beispiel musstest du das spielfeld an dein snake object uegeben... das kann so in etwas aussehen:

    public class Spielfeld
    {
        public int Weite { get; set; }
        public int Höhe { get; set; }

        public void abmessungSpielfeld(int weite, int höhe)
        {
            this.Weite = weite / 20;
            this.Höhe = höhe / 20;
        }
    }

    public class Snake
    {
        private Spielfeld spielfeld;
        public Snake(Spielfeld spielfeld)
        {
            this.spielfeld = spielfeld;
        }

        public void neuerPunkt()
        {
            Random r = new Random();
            int zahl1 = r.Next(0, spielfeld.Weite);
            int zahl2 = r.Next(0, spielfeld.Höhe);
        }
    }

ich persoenlich bin kein fan von umlauten im code... und wuerde eher davon abraten, aber das ist geschmackssache....

schau dir das untere beispiel von ein vereinfachte darstellung von ein spielfeld an, vielleicht regt das zu ein paar idden an....

    public class Spielfeld
    {
        private int[,] board;

        public int Breite
        {
            get { return board.GetLength(1); }
        }

        public int Höhe
        {
            get { return board.GetLength(0); }
        }

        public Spielfeld(int height, int width)
        {
            this.board = new int[height, width];
        }

        public bool IsFieldOccupied(int x, int y)
        {
            return this.board[x, y] == 0;
        }

        public void OccupyField(int x, int y)
        {
            this.board[x, y] = 1;
        }

        public void UnOccupyField(int x, int y)
        {
            this.board[x, y] = 0;
        }

    }

    public class Snake
    {
        private Random r = new Random();
        private Spielfeld spielfeld;
        public Snake(Spielfeld spielfeld)
        {
            this.spielfeld = spielfeld;
        }

        public void SetRandomPosition()
        {
            int x = r.Next(0, spielfeld.Breite);
            int y = r.Next(0, spielfeld.Höhe);
            spielfeld.OccupyField(x, y);
        }
    }

    public class Game
    {
        
        public void StartGame() {
            Spielfeld feld = new Spielfeld(10, 10);
            Snake snake = new Snake(feld);
            snake.SetRandomPosition();

        }
    }

Am Beispiel "weite" erklärt:

public class Spielfeld
{
   puplic int weite;
//...

Spielfeld meinSpielfeld = new Spielfeld();
int w = meinSpielfeld.weite;

Die so ermittelte Weite wird der Funktion NeuerPunkt in einer neuen Instanz "Snake" übergeben. Dazu gibst du der Funktion zwei Übergabeparameter:

NeuerPunkt(int width, int height)

Toraka  10.10.2014, 13:39

Die Weite würde wohl nicht als neuer Punkt übergeben. Die Variable wurde nur als Beispiel verwendet, um das Prinzip zu verdeutlichen. Natürlich könnte auch mit Vererbung und anderen Verfahren gearbeitet werden. Das hängt vom Umfang der benötigten Daten und von der Art und Weise des Gebrauchs dieser ab. Wenn es nur um zwei Werte geht, wäre das, wie im Beispiel gezeigt, relativ einfach möglich.

Häufig wird die von dir beschriebene Situation so gelöst, dass eine Verknüpfung zwischen den Objekten hergestellt wird. Die kann uni- oder bidirektional sein, das hängt davon ab, was miteinander verknüpft werden soll.

In deinem Fall würde ich der Klasse Snake über den Konstruktor mitteilen, innerhalb welches Spielfeldes sie sich befindet:

public class Spielfeld
{
    public int weite;
    public int höhe;

    public void abmessungSpielfeld(int iweite, int ihöhe)
    {
        weite = iweite / 20;
        höhe = ihöhe / 20;
    }
}

public class Snake
{   
        private Spielfeld m_Spielfeld = null;
        
        public void Snake(Spielfeld p_Spielfeld)
        {
              m_Spielfeld = p_Spielfeld;
        }
        
    public void neuerPunkt()
    {
        Random r = new Random();
        int zahl1 = r.Next(0, m_Spielfeld.weite);
        int zahl2 = r.Next(0, m_Spielfeld.höhe)
    }
}


...
Spiefeld feld = new Spielfeld();
feld.abmessungSpielfeld(200, 200);
Snake schlange = new Snake(feld);
...

Das einfach mal so als simpelste Variante.

Woher ich das weiß:Hobby – private Programmiererei

mach die variablen public ... und greif über instanc.Eigenschaft drauf zu