myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Ansprechen von Eigenschaften und Methoden von Objekten (objektorientierte Programmierung)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Ansprechen von Eigenschaften und Methoden von Objekten (objektorientierte Programmierung)

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
BlauerTeddy BlauerTeddy ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.05.2019
Beiträge: 4
Entwicklungsumgebung: Visual Studio 2019 / Win10
Herkunft: Österreich


BlauerTeddy ist offline

Ansprechen von Eigenschaften und Methoden von Objekten (objektorientierte Programmierung)

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo liebe Programmierer!

Ich habe ein Problem für das ich seit Wochen in meiner Freizeit eine Lösung suche. Bitte lacht Euch nicht kaputt, wenn ihr mein Problem seht. Aber ich kapiers einfach nicht..

Ich möchte nachdem ich eine Klasse angelegt habe, Objekte davon anlegen. Soweit klappt das auch alles. Aber wenn ich die Methoden des Objekts oder seine Eigenschaften ansprechen möchte, bekomme ich nur eine Fehlermeldung.

Ich schreibe in C# mit WPF, aber ich denke nicht, dass es ein WPF-Problem ist.

C#-Code:
namespace Objekte_und_Methoden_Test
{
    class Helden
    {
        public string name { get; set; }
        public int alter;
        public int stärke;
        public int lebensenergie;

        public void Kampf(int schaden)
        {
            lebensenergie = stärke - schaden;
        }

        public void Heilung()
        {
            lebensenergie++;
        }
    }
}

Mein eigentlicher Programmcode:

C#-Code:
namespace Objekte_und_Methoden_Test
{

    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
            Helden Marco = new Helden();
            {
                Marco.alter = 20;
                Marco.name = "Marco";
                Marco.lebensenergie = 20;
                Marco.stärke = 10;
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Marco.alter++; //<--- FEHLER
        }
    }
}

Mein Problem ist, dass er "Marco.alter" nicht erkennt. Er sagt dann immer

Fehlermeldung:
"CS0103 Marco ist im aktuellen Kontext nicht vorhanden."
02.05.2019 21:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
KroaX KroaX ist männlich
myCSharp.de-Mitglied

avatar-4080.jpg


Dabei seit: 31.08.2009
Beiträge: 278
Herkunft: Köln


KroaX ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Im Scope deine Button Click Methode die vermutlich über einen Eventhandler ausgeführt wird ist die Instanz deiner Klasse Helden bereits nicht mehr verfügbar.

Der Ablauf bei dir wäre:

- MainWindow wird erstellt
- Klasse Helden wird erstellt
- Klasse Helden wird verworfen da sie nirgendwo zwischengehalten wird
-

Du kannst dir das so vorstellen, als dass am Ende jeder Methode alles weggeräumt wird was du innerhalb einer Methode gemacht hast, es sei denn du tust Dinge um deine erstellten Konstrukte irgendwo zwischen zu speichern. Gewöhnlich passiert das über instanzvariablen. Ähnlich hast du das bereits bei deiner Helden Klasse gemacht.

Natürlich ist es nicht unbedingt immer klug alles in Klassenvariablen zwischen zu halten, aber für dein momentanes Verständnis sollte dich diese Info vielleicht weiterbringen.
02.05.2019 21:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
BlauerTeddy BlauerTeddy ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.05.2019
Beiträge: 4
Entwicklungsumgebung: Visual Studio 2019 / Win10
Herkunft: Österreich

Themenstarter Thema begonnen von BlauerTeddy

BlauerTeddy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich glaube es dank deiner Hilfe gelöst zu haben! :)

C#-Code:
{
    public partial class Window1 : Window
    {
        Helden Marco = new Helden();
        Helden Tobias = new Helden();


        public Window1()
        {
            InitializeComponent();

            Marco.alter=40;
            Marco.name="Marco";
            Tobias.alter=38;
            Tobias.name="Tobias";
        }

        void button1_Click(object sender, RoutedEventArgs e)
        {
            string Ergebnis = ""+Marco.alter;
            TextBox1.Text = Ergebnis;
        }
    }
}

Es scheint als läge die Lösung darin die Objekte in der äußersten geschweiften Klammer zu erzeugen.
Die Eigenschaften dürfen dann aber erst später behandelt werden. Sonst kommts wie bei mir so oft zu Fehlermeldungen.
Allerdings dachte ich schon öfter ich hätte es gelöst. :D

Ist das ein passender Weg? Oder bringt dieses Vorgehen später andere Probleme?
03.05.2019 08:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.976
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von BlauerTeddy:
Es scheint als läge die Lösung darin die Objekte in der äußersten geschweiften Klammer zu erzeugen.

Nein, mit der Erzeugung hat das nichts zu tun. Du hast zwei unterschiedliche Arten von Variablen erzeugt. Im ersten Versuch - der mit dem Fehler - handelt es sich um eine lokale Variable. Diese ist nur innerhalb der Methode verfügbar, in der sie deklariert, erzeugt und gefüllt wurde.

Im zweiten Versuch jetzt hast du eine sogenannte Instanzvariable (auch: "Feld") erzeugt. Deine Klasse "Window1" hat jetzt zwei Felder "Marco" und "Thomas". Diese beiden Felder sind innerhalb der Klasse überall bekannt. Du kannst sie an jeder Stelle erzeugen (mit "new"). Eine übliche Stelle wäre der Konstruktor der Klasse, eine zweite übliche Stelle wäre dort, wo du es gemacht hast (gleich bei der Deklaration).

Instanzvariablen solltest du mit Zugriffsmodifikatoren versehen. Diese regeln, der alles auf sie zugreifen darf. "private" heisst: nur innerhalb der Klasse. Bei der Namensvergabe für private Felder wird häufig ein _ dem kleingeschriebenen Namen vorangestellt. Siehe auch  [Artikel] C#: Richtlinien für die Namensvergabe .

C#-Code:
public class Window1 : Window
{
    private Helden _marco;
    private Helden _tobias = new Helden();
    private Helden _robin; //nur Deklaration ("Bekanntmachung"), kein Erzeugen ("Instanziierung")

    public Window1()
    {
         this._marco = new Helden(); //Variante über Konstruktor. "this" kann auch weggelassen werden, es zeigt an, dass es sich um Element der Klasse handelt.
         _marco.Alter = 40;
         _marco.Name = "Marco";
         _tobias.Alter = 20;
         _robin.Alter = 24; //Fehler: Robin wurde noch nicht erzeugt!
         _robin = new Helden();
    }
}

Das sind allerdings sehr grundlegende Grundlagen in der OOP, nicht einmal spezifisch für C#, sondern so (oder fast so) auch gültig in jeder anderen objektorientierten Hochsprache.

Wäre ein guter Zeitpunkt, um mal ein Buch zur Hand zu nehmen :).

LaTino

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am 03.05.2019 13:55.

03.05.2019 13:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 2 Monate.
BlauerTeddy BlauerTeddy ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.05.2019
Beiträge: 4
Entwicklungsumgebung: Visual Studio 2019 / Win10
Herkunft: Österreich

Themenstarter Thema begonnen von BlauerTeddy

BlauerTeddy ist offline

Aus Klassen erzeugte Objekte zu anderen Frames mitnehmen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo liebe Alle,

Die Monate vergingen und ich habe ein leider sehr essentielles Problem nicht lösen können.
Wenn ich in WPF ein Objekt erzeuge (Beipiel: das Objekt "Marco" der Klasse "Held"), so bleibt es plump gesagt in dem Frame, in dem ich es erzeuge. Das nächste Frame, das ich in eine Form lade weiss nichts von dem Objekt. Natürlich kann ich Werte mit dem Konstruktor übergeben, doch eben keine Objekte. und bei über 150 Variablen (wenn ich Klassen und Objekte umgehe) ist das echt mühsam und komplex.
Ich bat einen C++ Programmierer um Hilfe. Allerdings stieß er recht überrascht auf das gleiche Problem.
Ich bitte Euch abermals um Rat, wie ich nicht nur Variablen, sondern ganze Objekte von einem Frame zu dem nächsten übergeben kann.

In den Büchern "Einstieg in C# für mit Visual Studio 2019" und "Windows Presenter Foundation", sowie der Videoreihe C# Masterkurs aus programmieren-starten.de. Fand ich keine Behandlung meines Problems.

Zur Zeit arbeite ich wieder in Umgehung der Objektorientierung nur mit vielen Variablen ohne Klassen und Objekte dafür anzulegen.

Ich wäre Euch WIRKLICH dankbar, wenn ihr mir da einen Hinweis auf mein fehlerhaftes Verständnis geben würdet. Wo denke ich so falsch, dass in keinem Buch oder so auch nur Jemand an so ein Problem denken braucht?
28.07.2019 11:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.248
Herkunft: Leipzig


MrSparkle ist online

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das Stichwort ist doch bereits in den vorherigen Antworten gegeben worden: Scope bzw. Gültigkeitsbereich von Variablen.

Der Rest ist Objektorientierte Programmierung. Masterkurse und Bücher zu WPF behandeln das sicherlich nicht, sondern setzen es voraus.

Fang lieber erstmal damit an, dir eine Objektstruktur zu überlegen, und wenn das grundsätzlich funktioniert, kannst du mit WPF loslegen. Scheint, als hättest du dich da ein wenig übernommen.
28.07.2019 22:24 Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 446
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Um es noch spezifischer zu beantworten, wäre etwas Code nicht schlecht, um sich generell ein Bild machen zu können.

Vielleicht fehlt ihm ja nur ein kleiner Stupser zu dem großen Ahaaaa Augenzwinkern
29.07.2019 08:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Jamikus Jamikus ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.11.2012
Beiträge: 225
Entwicklungsumgebung: MS Visual
Herkunft: Oberhausen (NRW)


Jamikus ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von BlauerTeddy:
Natürlich kann ich Werte mit dem Konstruktor übergeben, doch eben keine Objekte.

Hast du denn schon mal versucht einen Konstruktor zu erstellen, welcher in der Signatur ein Objekt vom Typ "Helden" bzw. mehrere Objekte vom Typ z.B. List<Helden> möchte?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Jamikus am 29.07.2019 10:42.

29.07.2019 10:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
BlauerTeddy BlauerTeddy ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.05.2019
Beiträge: 4
Entwicklungsumgebung: Visual Studio 2019 / Win10
Herkunft: Österreich

Themenstarter Thema begonnen von BlauerTeddy

BlauerTeddy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich habe aktuell das Problem, dass ich in WPF keine klassische Main-Methode habe.
Vielmehr wird die MainMethode vom System laufend neu zurück gesetzt und lässt sich auf normalem Weg nicht manipulieren.
Das zwingt mich dazu, Objekte (Instanzen einer Klasse) in den C#-Codes der Fenster und Frames des WPF anzulegen. Allerdings nimmt er mir die Objekte und auch einfache Variablen nicht mit zu den anderen Fenstern und Frames, da diese jeweils eigene C#-Codes haben. Lediglich mit dem Konstruktor kann ich diese übergeben.

Bisher habe ich folgende "Umgehungen" überlegt.
1. Ich lasse alles in einem Fenster ohne Frames laufen. Dort kann ich die Objekte erzeugen und problemlos im gesamten Code darauf zugreifen. Dafür muss ich aber alle Buttons, Images usw. in einem Fenster erzeugen und auf Width = 0 setzen, wenn ich sie ausblenden will. Will ich sie anzeigen oder ausblenden, dann manipuliere ich mittels C#-Code diese Breite und zeige sie je nach Position im Spiel an. Das ist natürlich recht unübersichtlich in der Programmierung und Gestaltung mit all den Buttons usw. Aber.. Ich kann objektorientiert programmieren.
2. Ich arbeite mit einem Fenster und vielen Frames. Hier kann ich je nach Position im Spiel die ensprechend gestalteten Frames ins Fenster laden. Aber.. es stirbt damit die objektorientierte Programmierung, da ich alles mittels Konstruktor übergeben muss und der mir keine Objekte nimmt. Eventuell habe ich noch nicht gecheckt, wie man Objekte über diesen überträgt. Also übergebe ich hunderte Variablen mit dem Konstrukor in das nächste Frame. Und das bei bisher etwa 10 Frames. Es ist wahnsinnig unübersichtlich und mühsam. :(
3. Ich lege eine Datenbank an und lese und schreiben einfach in allen Fenstern und Frames die benötigten Werte aus dieser aus oder manipuliere sie.

Mein Traum ist jedoch, dass ich in WPF über mehrere Frames hinweg die gleichen Objekte benutzen kann. So wie in einem "normalen" C#-Code.

Erzeugung des Objekts HausBaden:

C#-Code:
namespace Laufhaus_Imperium
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Häuser HausBaden = new Häuser();
            HausBaden.Name = "Schneckenhaus";
        }

        private void HalloWeiterButton_Click(object sender, RoutedEventArgs e)
        {
            MainFrame.Content = new Startseite(); //
        }
    }
}

In all den folgenden Frames existieren die Objekte nicht mehr. Sodass ich es aktuell mit der 2. Version versuche. Aber es scheint mir so verrückt zu sein, die objektorientierung umgehen zu müssen, um WPF mit mehreren Frames zu nutzen. Das kann nicht im Sinn der Sache sein. (ich schreibe das Spiel ja um zu lernen. Auf eine grafische Oberfläche mag ich jedoch nicht verzichten..)

Leider habe ich keine Ahnung wie die vorgeschlagene Variante mit dem Konstrukor aussehen könnte. Dafür bin ich wohl noch nicht weit genug. You-Tube-Videos zur Übergabe von Werten in WPF finde ich auch nur für einfache Variablen.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von BlauerTeddy am 02.08.2019 09:26.

02.08.2019 09:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 830


witte ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Es wäre sinnvoll diese Anwendung mit dem MVVM-Pattern zu erstellen. Damit kannst du dir deinen Traum erfüllen: verschiedene Views (von dir Frames genannt) werden von ViewModels repräsentiert welche sich ein Model teilen (das die verschiedenen VM anzeigen sollen). Such mal nach MVVM - da gibt es sicherlich viel Literatur darüber.
Klassen sollten übrigens im Singular benannt werden, du sagst ja auch nicht "ich baue mir mal ein Häuser".

C#-Code:
var hausBaden = new Haus { Name= "Schneckenhaus" };

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von witte am 02.08.2019 10:17.

02.08.2019 10:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.253
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

02.08.2019 12:33 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 7 Monate.
Der letzte Beitrag ist älter als 4 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 12.12.2019 17:21