Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

von Klasse auf das Objekt einer anderen Klasse zugreifen

Empfohlene Antworten

Veröffentlicht

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.

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.

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;

            }

        }


    }

}

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

hättet ihr ein link für mich? weis net wo ich das suchen/finden kann.

tipp in deinem Qt das Wort "property" ein, markier es danach und drück dann F1

Funktioniert natürlich nur, wenn du die Hilfe-Dateien (MSDN) installiert hast.

Gruß

Die Lady

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?

genau nach diesem System läuft eine Property :)

na wenn ich kein genie bin ;)

danke nochmals.

  • 2 Monate später...

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!

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?

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?

Ist dir der Unterschied zwischen Klasse und Instanz klar?

Na ja... eigentlich nicht :rolleyes:

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?

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?

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;

}

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?

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?

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!

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.

Main ist ne andere Klasse?

Genau... "Main" ist eine eigene Klasse (neues Form) wo eine richTextBox existiert die den Wert des Strings "ausgabe" annehmen soll.

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.

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?

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.