Zum Inhalt springen

von Klasse auf das Objekt einer anderen Klasse zugreifen


Empfohlene Beiträge

Geschrieben

Hello,

also

ich hab drei Klassen: Klasse1, Klasse2, Klasse3!

ich habe jetzt in Klasse2 ein Objekt von Klasse1 erstellt

Klasse1 meinObjekt = new Klasse1 ();

jetzt hab ich einige berechnungen durchgeführt und will nun mit der Klasse3 auf das Ergebnis (erstellte Objekt) von Klasse2 zugreifen.

Geschrieben

Schonmal was von Kapslung gehört?

Standardmäßig sind Member nicht nach außen hin sichtbar.

Am Besten schreibst du eine Property oder eine Funktion (public machen), die das Objekt nach außen gibt.

Geschrieben

habs jetzt gelöst:

ich ab einfach ein varialble

string ergebnis
erstellt dieser dann das Ergebnis zugewiesen und dann aus der klasse drauf zugegriffen. falls jemanden der code interessiert: Form1.cs
using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;


namespace Uebergabe

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }


        private void newFormToolStripMenuItem_Click(object sender, EventArgs e)

        {

            Form2 form2 = new Form2();

            form2.ShowDialog();

            label1.Text = form2.nText;

        }


    }

}
Form2.cs
using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;


namespace Uebergabe

{

    public partial class Form2 : Form

    {


        Speicher save = new Speicher();

        public string nText;


        public Form2()

        {

            InitializeComponent();

        }


        private void button1_Click(object sender, EventArgs e)

        {


            save.Text = textBox1.Text;

            label1.Text = save.Text;

            nText = save.Text;

        }

    }

}
Speicher.cs
using System;

using System.Collections.Generic;

using System.Text;


namespace Uebergabe

{

    class Speicher

    {

        private string text;


        public Speicher()

        {

            //if (text == "")

            text = "Konstruktor";

        }


        public string Text

        {

            get

            {

                return text;

            }


            set

            {

                text = value;

            }

        }


    }

}

Geschrieben

eine Variable public oO

Funktionieren tut das auf jeden Fall, ist jedoch kein guter Programmierstil und würde ich mir wieder abgewöhnen. Befolge einfach TDMs rat und lies dir mal die Hilfe zu den propertys durch.

Gruß

Die Lady

Geschrieben

danke.

und wie wärs wenn ich es so mache:

Form2.cs


private string nText;


public string Get_nText()

        {

            return nText;

        }

Form1.cs
label1.Text = form2.Get_nText();

zeigt das trotzdem einen schlechten Programmierstiel?

  • 2 Monate später...
Geschrieben

Hallo Leute,

habe genau das gleiche Problem, nur komme ich leider nicht ganz mit dem Lösungsansatz klar.

Ich habe zwei Klassen: Main, Rechnen

In der Klasse Main befindet sich eine richTextBox, die Ergebnisse von der Klasse Rechnen ausgeben soll.

Main.cs


Rechnen FormRechnen = new Rechnen();

TextBox_Rechenverlauf.AppendText(FormRechnen.ausgabe + "\r\n");

Rechnen.cs

private string ausgabe;


private void Aktion()

{

     //...

     erg = x + y;

     ausgabe = Convert.ToString(erg);

}

Leider passiert hier überhaupt nichts. Ich habe schon zahlreiche Versuche unternommen und mitbekommen, dass der neue String "ausgabe" aus der Methode "Aktion()" nicht übernommen wird.

Vielen Danke im voraus!

Geschrieben

Die Methode "Aktion()" wird aufgerufen (nur im Code nicht sichtbar). Daher wäre es mir lieber, wenn ich aus der Klasse "Rechnen" von der Methode "Aktion" heraus die richTextBox in der Klasse "Main" füllen kann. Geht das nicht?

Geschrieben
Die Methode "Aktion()" wird aufgerufen (nur im Code nicht sichtbar).

Mag sein, dass sie aufgerufen wird, aber offensichtlich nicht mit der Instanz der Klasse Rechnen, die du in Main neu erzeugst.

Jedes Rechnen-Objekt hat seinen eigene ausgabe-Variable. Wenn du bei einem solchen Objekt die Methode Aktion aufrufst, kannst du nicht erwarten, dass das auf die Ausgabe eines ganz anderen Objekts irgendeinen Einfluss hast.

"Was du in einen Schrank hineinlegst, kannst du nicht aus einem anderen herausholen."

Ist dir der Unterschied zwischen Klasse und Instanz klar?

Geschrieben

Stell dir mal vor, du hast einen neuen Schrank. Neue Schränke sind weiß. Du malst deinen Schrank rot an. Dann kaufst du dir noch einen Schrank, genau den gleichen. Welche Farbe hat der?

"Schrank" ist deine Klasse Rechnen.

"Schrank rot Anmalen" ist das Aufrufen der Methode Aktion.

Und die Farbe des Schranks ist der Wert, den du in ausgabe speicherst.

Und wenn du "new Rechnen" sagst, kaufst du einen neuen Schrank. Der ist weiß, egal wie viele andere Schränke du vorher angemalt hast.

Jetzt klarer?

Geschrieben

Sehr schöne Erklärung... danke!!!

Nun habe ich noch ein wenig versucht, komme aber immer noch nicht auf einen grünen Zweig :(

Kannst mir mir einen Code-Ansatz geben, mit dem ich weiter arbeiten kann?

Geschrieben

Ich denke, ich habe es nun doch von allein geschafft!

Main.cs


private void button1_Click(object sender, EventArgs e)

{

     Rechnen FormRechnen = new Rechnen();

     string test = FormRechnen.Get_ausgabe();

     richTextBox1.AppendText(test);

}

Rechnen.cs

private string ausgabe;


private void Aktion()

{

     //...

     erg = x + y;

     ausgabe = Convert.ToString(erg);

}


public string Get_ausgabe()

{

     Aktion();

     return ausgabe;

}

Geschrieben

Hm... in diesem einfachen Beispiel kein Problem.

Allerdings bringt es mir in meinem komplexen Programm nichts die Methode Aktion() in der Methode Get_ausgabe() aufzurufen. Die Methode Aktion() wird schon eher (also unabhängig) von der Methode Get_ausgabe() ausgeführt.

Wie gehe ich nun vor?

Geschrieben
Wie gehe ich nun vor?
Du brauchst den richtigen Schrank, um beim Beispiel zu bleiben.

Du rufst Aktion mit einer ganz bestimmten Instanz der Klasse Rechnen auf. An der Stelle, an der du die Ausgabe brauchst, brauchst du also eine Referenz auf genau diese Instanz. Du musst dir merken, welchen Schrank du angemalt hast.

Zeig doch mal, wie und wo du Aktion aufrufst. Woher kommt das Rechnen-Objekt, mit dem du das tust?

Geschrieben
Woher kommt das Rechnen-Objekt, mit dem du das tust?

Ich denke mal, du meinst diese Zeile: Rechnen FormRechnen = new Rechnen();

Damit will ich eigentlich nur bezwecken, dass ich in der Klasse "Main" auf die Klasse "Rechnen" zugreifen kann.

Wie und wo ich genau die Methode Aktion() aufrufe gebe ich dir morgen durch!

Geschrieben

Sooo... hier nun das komplexe Gebilde.

In meine Programm gibt es mehrere Klassen. Wir reden jetzt aber nur von der Klasse "Main" und der Klasse "Grundrechenarten".

Grundrechenarten.cs


public int aktion = 0;


// Rechenart auswählen

private void button_Auswahl_Click(object sender, EventArgs e)

{

    if (treeView_Grundrechenarten.SelectedNode == treeView_Grundrechenarten.Nodes[0])

    {

        aktion = 1;

        panel_Grundrechenarten.Visible = true;

    }

}


// Button "Berechnen"

private void button_Berechnen_Click(object sender, EventArgs e)

{

    switch (aktion)

    {

        case 1:

            Aktion(1);

            break;

    }

}


private string ausgabe;


// Methode Aktion()

private void Aktion(int aktion)

{

    double x = Convert.ToDouble(textBox1.Text);

    double y = Convert.ToDouble(textBox2.Text);

    double erg;


    switch (aktion)

    {

        case 1:

            erg = x + y;

            ausgabe = Convert.ToString(x) + " + " + Convert.ToString(y) + " = " + Convert.ToString(erg);

            break;

    }

}


public string Get_ausgabe()

{

    return ausgabe;

}

Da nun die Methode "Aktion()" schon abgehandelt wurde weiß ich nun nicht weiter, wie ich den String "ausgabe" in die Klasse "Main" bekomme.

Geschrieben
Da nun die Methode "Aktion()" schon abgehandelt wurde weiß ich nun nicht weiter, wie ich den String "ausgabe" in die Klasse "Main" bekomme.
Das hat mit dem Inhalt der Klasse Grundrechenarten praktisch nichts zu tun. Entscheidend ist, wie und wo du die Instanz dieser Klasse anlegst. Ich dachte, das wäre inzwischen klar geworden.

Wenn du nicht weißt, wie du deinen rot angemalten Schrank wiederfinden sollst, helfen dir selbst die besten Schrankbaupläne nicht weiter.

Geschrieben

Ich kann mir das alls logisch vorstellen, nur scheitert es an der praktischen Umsetzung :rolleyes:

Soben habe ich ein bisschen was über Instanzen gelesen und komme aber auch nicht so richig zurecht, wo ich was ändern muss. Kannst du mir nicht ein wenig vom Bauplanplan gben?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...