tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
549
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    kreye kreye ist offline Rookie
    Registriert seit
    Jul 2010
    Beiträge
    9
    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.
     

  2. #2
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Wie sieht denn dein momentaner Code aus? Kann mir gerade nichts unter deinem Problem vorstellen!
     

  3. #3
    Tim Bureck Tim Bureck ist offline Mitglied Platin
    Registriert seit
    Apr 2009
    Ort
    Düsseldorf (NRW)
    Beiträge
    508
    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)
     

  4. #4
    kreye kreye ist offline Rookie
    Registriert seit
    Jul 2010
    Beiträge
    9
    Also ich habe Klasse A

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    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
    Geändert von kreye (03.11.10 um 11:38 Uhr)
     

  5. #5
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    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.
     

  6. #6
    kreye kreye ist offline Rookie
    Registriert seit
    Jul 2010
    Beiträge
    9
    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.
     

  7. #7
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    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.
     

  8. #8
    kreye kreye ist offline Rookie
    Registriert seit
    Jul 2010
    Beiträge
    9
    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.
     

  9. #9
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Beispiel:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    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!
     

  10. #10
    kreye kreye ist offline Rookie
    Registriert seit
    Jul 2010
    Beiträge
    9
    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.
     

  11. #11
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Das kannst du nicht, denn a ist nur in der Funktion Main bekannt, nicht in der Klasse B. Du könntest einen Konstruktor von B machen, der ein A erwartet:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    public class A
    {
           public string Name { get; set; }
    }
     
    public class B
    {
           public B(A a)
           {
                  myA = a;
           }
     
           public void foo() { Console.WriteLine(myA.Name); }
     
           A myA;
    }
     
    ...
    void Main()
    {
             A a = new A();
             a.Name = "im a A";
             B b = new B(a);
             b.foo();
    }
     

Ähnliche Themen

  1. Aus Klassen Objekte instanziieren
    Von takidoso im Forum Java
    Antworten: 3
    Letzter Beitrag: 07.09.09, 11:05
  2. Variable in anderen Klassen benutzen
    Von rodanyboy im Forum Java
    Antworten: 6
    Letzter Beitrag: 11.10.07, 09:11
  3. C# Klassen und Objekte weiterreichen
    Von Cortadillo im Forum .NET Café
    Antworten: 5
    Letzter Beitrag: 01.06.07, 15:18
  4. Antworten: 2
    Letzter Beitrag: 05.07.06, 14:55
  5. Antworten: 2
    Letzter Beitrag: 23.09.04, 15:12