Autor Beitrag
R1N0XCU53
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 31.07.11 18:28 
Hallo alle Community Mitglieder,

mein Problem ist, dass ich noch Anfänger in C# bin und deswegen kleinere Probleme mit der Syntax habe.

Also folgendes:
Ich habe 3 Klasse. Ich möchte von der einen Klasse "Ash" auf eine Variable "ashx" der anderen Klasse "Hintergrund" zugreifen. Doch ich bekomme immer die Fehlermeldung "Der Name "hintergrund" ist im aktuellen Kontext nicht verfügbar"

Hier mal der relevante Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
namespace Spiel
{
   
    public class Maingame : Microsoft.Xna.Framework.Game
    {
        Hintergrund hintergrund;
        Ash ash;

        protected override void Initialize()
        {
            hintergrund = new Hintergrund();
            ash = new Ash();
            base.Initialize();
        }
}


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
namespace Spiel
{
    class Ash
    {
         public void Update(GameTime gameTime)
        {
            if (Keyboard.GetState().IsKeyDown(Keys.Down))
            {
                hintergrund.ashy++;
            }
         }
     }
}


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
namespace Spiel
{
    public class Hintergrund
    {
        public int ashx = 13;
        public int ashy = 25;
     }
}



Ich hab's schon damit versucht die Variablen u.a. als static zu deklarieren, aber prinzipiell muss ja möglich sein von der einen Klasse auf die Variablen der anderen Klasse zu zugreifen. Ich habe es auch schon mit der Online Hilfe probiert, aber wie im Beispiel habe ich die Variable nicht in einem if oder sonstigem Block initialisiert:
msdn.microsoft.com/q...S0103%29&rd=true

Vielen Dank schon im Voraus!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 01.08.11 09:51 
Hallo und :welcome:

dir scheint die Objektorientierung noch nicht ganz klar zu sein. Für den Zugriff auf einen Membervariable benötigst du ein Objekt (genauer: eine Referenz auf ein Objekt) dieser Klasse.
Du könntest der Klasse Ash eine Referenz auf das eigene Maingame-Objekt mitgeben:
ausblenden C#-Quelltext
1:
ash = new Ash(this);					

und dann in der Klasse Ash eine Referenz darauf in einer Membervariablen halten (alternativ: eine Eigenschaft dafür deklarieren).

Schöner (bzw. professioneller) und getreu dem Motto "Trennung von GUI und Logik" ist es besser ein Ereignis von der Klasse Ash aus zu werfen, s.a. mein Artikel dazu: Kommunikation von 2 Forms (bzw. zwischen Form und Klasse).
R1N0XCU53 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 01.08.11 11:50 
Vielen Dank erstmal,

mein Problem ist, dass das fertige Programm schon in Processing geschrieben ist, ich es aber 3D fähig machen will und deswegen in C# jetzt schreibe.

Ich kann mir denken wie die Lösung so ungefähr aussehen soll, hab hier auch ein Code-Beispiel gefunden, das zeigt aber leider wie die Variable an eine Methode weitergegeben wird. Ich will aber einfach nur den Wert der Variable verändern.
www.buha.info/board/...5057&postcount=4

Hast du evt. ein Code Beispiel?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 01.08.11 12:37 
Zitat:
aber prinzipiell muss ja möglich sein von der einen Klasse auf die Variablen der anderen Klasse zu zugreifen


Ja, aber du willst die Variablen einer bestimmten Instanz der Hintergrund Klasse ändern und damit müssen sich die konkreten Ash und Hintergrund Instanzen kennen.
Dazu kannst du einfach z.B. der Ash Klasse einen Verweis auf die konkrete Hintergrund Klasse verpassen. Zum Beispiel über den Konstructor (oder eine Property, Event etc.).

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
class Ash
{
    private Hintergrund _hintergrund;     

    public Ash(Hintergrund hintergrund)
    {
       _hintergrund = hintergrund;
    }
 
    public void Update(GameTime gameTime)
    {
        if (Keyboard.GetState().IsKeyDown(Keys.Down))
        {
            _hintergrund.ashy++;
        }
    }
}


In der Initialize Methode müsstest du dann eben den Konstructor von Ash enstprechend aufrufen um die 2 Klassen zu 'verdrahten'.

ausblenden C#-Quelltext
1:
ash = new Ash(hintergrund);					
R1N0XCU53 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 02.08.11 23:31 
Vielen Dank hat geklappt! :)