C# Finde die Objekte aus anderen KLassen nicht

kreye

Grünschnabel
Hey,
Ich bin gerade dabei von Java auf C# umzusteigen.

Nun stehe ich vor einem Problem, was am Anfang als keins erwarten war.

Ich will ein Objekt, was ich in Klasse A erzeugt habe auch in Klasse B benutzen (Beide public).

Eine sehr triviale, aber nicht erwünschte Vorgehensweise wäer es, einfach alles als public zu instanziieren.
Ein anderer Weg wäre über getter und setter zu gehen.

Mein Problem ist nun, ich kann einfach nicht auf diese Objekte zugreifen, sei es, mit getter/setter oder als public. Mein Problem ist das ich z.B. in Klasse B nichtmals die Instanz von Klasse A finde, und somit auch nicht die Methoden/Objekte von Klasse A. Obwohl alles public ist.

Kann mir hier jemand mal einen Beispielcode reinsetzen, wo das funktioniert****?
Vllt habe ich da ja irgendwo nen Denkfehler drin.
 
Vorab mal nette Lektüre für den Umstieg: From Java to C#

Sind deine Klassen als public deklariert? Haben sie keinen Access modifier, sind sie internal, was bedeutet, dass die Klassen jeweils nur im eigenen Sourcefile sichtbar sind. (s. Kap. 8.1)
 
Also ich habe Klasse A

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.OleDb;
using MySql.Data.MySqlClient;

namespace WWM
{
    /// <summary>
    /// Interaktionslogik für Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
         private Datenbankverbindung dbconnection;
         public Datenbankverbindung DbConnerction
         {
             get
             {
                 return dbconnection;
             }
         }
        
        
        public Window1()
        {
            InitializeComponent();
        }
        public void Bla()
        {
        }
   

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            dbconnection = new Datenbankverbindung();
                                          
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {

            Spielfeld spielfeld = new Spielfeld();
            spielfeld.Show();
            this.Hide();
           
           

        }
    }
}

In Klasse A erzeuge ich also eine Objekt vom Typ Datenbankverbindung und habe dazu auch nen getter gemacht.
Darüber hinaus habe ich noch die Methode Bla() die ich jetzt nur zur anschauung beigefügt habe.
Dann erzeuge ich noch ein neus Objekt vom Typ Spielfeld welches auch von Window erbt.
siehe hier:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;


namespace WWM
{
    /// <summary>
    /// Interaktionslogik für Spielfeld.xaml
    /// </summary>
    public partial class Spielfeld : Window
    {
        public Spielfeld()
        {
            InitializeComponent();
                       
            
            
        }
    }
}

Nun will ich auf die Datenverbindung aus Window1 zugreifen oder auch auf die Methode Bla aus Window1. Mein Problem ist, dass ich in Spielfeld nicht mals das Objekt von Window1 finde. Ich finde immer nur den Typ Window1.

Window1 wird ja durch die App.xaml.cs erzeugt.

Natürlich gehören da ja noch die xaml Dateien zu, aber ich denke die Codebehindfiles reichen.

P.S. Danke Tim, aber das hat mir nciht wirklich weitergeholfen, laut dem Text schein ich alles richtig zu machen, aber ich kriege es trotzdem nicht richitg hin. habe das ganze auch in einem Consolenprojekt probiert, mit dem selben Ergebnis
 
Zuletzt bearbeitet:
Du musst erstmal eine Instanz von Window1 erstellen. Falls Window1 die Klasse deines Hauptfensters ist, das auch so angezeigt wird, dann wird die Instanz von Window1 vermutlich in der Main-Routine des Programms erstellt.
 
Genau, die wird in der App.xaml/cs erzeugt. Es muss ja beim Programmstart eine Instanz erzeugt werden weil sich das ganze sonst ja nicht öffnen würde. Die Frage ist da nur noch, wie komme ich an diese Instanz.
Das ganze habe ich ja via Visual c# 2008 express als WPF-Anwendung erstellt. Von daher läuft das ja auch alles automatisch. Komisch ist ja auch, das ich das Problem ja nicht nur in diesen einen Fall habe, sondern auch in anderen Projekten. Ich finde nie die Instanzen der Klassen die ich erzeuge. Was mache ich nur Falsch****?

Vielleichtt kann ja jemand mal einen Beispielcode liefern, in dem von einer Klasse auf die Methoden einer anderen Klasse zugegriffen wird.
 
Nun ja, die Instanz einer Klasse ist nur im Scope sichtbar, in dem sie erstellt wurde. Du kannst zum Beispiel das Singleton-Pattern bei Window1 anwenden, falls das passt.
 
Aber es existiert ja schon eine Instanz von Window1 und WIndow1 ist ja auch Public. Ich finde die nur nicht in den anderen Klassen. Der oben angeführte Code ist ja auch nur ein Beispiel, das Problem besteht ja auch in anderen Situationen. Wie machst du es denn, wenn du z.B. einen String oder ein anderes Objekt welches du in Klasse A erzeugt hast, auch in KLasse B benutzen willst.
 
Beispiel:
Code:
public class A
{
};

public class Program
{
         public static void Main()
         {
               A a = new A();
               foo();
         }


         public static void foo()
         {
                    // foo hat keine Ahnung von a
         }
};

Das public bezieht sich nicht auf Instanzen der Klasse, sondern lediglich auf den Typ!
 
Das ist mir schon klar, dass sich das public auf die Instanzen bezieht.
Meine Frage geht aber noch ein Stück weiter als dein Beispielcode.
Nehme wir den mal als Ausgangsbasis:
Du hast da ja nun "a" erzeugt. Wie machst du es nun, auf "a" von einer anderen Klasse zuzugreifen****?
Z.B. von Klasse B.
 

Neue Beiträge

Zurück