Laden...

Eine Klasse definieren und aufrufen...

Erstellt von amdspeed vor 17 Jahren Letzter Beitrag vor 17 Jahren 8.143 Views
amdspeed Themenstarter:in
10 Beiträge seit 2006
vor 17 Jahren
Eine Klasse definieren und aufrufen...

Guten Abend@C# Community

Ich habe erst vor kurzen angefangen mit C# zu programmieren, aber ich habe schon Kenntnisse von anderen Programmiersprachen, aber nun zu meinem Problem:

Ich möchte gerne Werte oder Ähnliches in einer Klasse speichern, sodass ich diese Werte in allen Windows Forms abrufen kann. Dafür habe ich bei Visual Studio 2003 eine neue Class erstellt, meine Werte dort auch ohne Problem eingetragen, nur erkännt er diese Werte nicht in der Form1. Was und vorallen, wo muss ich das eintragen, dass die Class1 in dem Form1 aufgerufen wird?

Vielen, vielen Dank schonmal 🙂

L
497 Beiträge seit 2006
vor 17 Jahren

Mh, also das ist eine ziemlich grundlegende Frage für alle OO-Sprachen. Ich nehme also an, dass Deine bisherigen Programmiererfahrungen keine Objektorientierung umfassen. Deshalb solltest Du Dir schon ein buch zum thema gönnen.

Als Einstieg wird hier meistens folgendes Buch empfohlen: http://www.galileocomputing.de/openbook/visual_csharp/index.htm (weil fast alles drin und kostenlos)

Zu Deiner Frage: Ohne den näheren Verwendungszweck zu kennen, würden mir folgende Möglichkeiten einfallen:

  • Die Klasse (geht erst ab .NET 2.0) oder zumindest ihre Methoden und Properties (geht auch schon vor .NET 2.0) statisch machen, dann kannst Du von überall auf ihre Methoden und Properties zugreifen, wenn Du ihren Namespace inkludiert hast
  • Ein Objekt von Class1 in Form1 erzeugen und dieses verwenden
  • Eine zentrale Klasse erzeugt sowohl ein Objekt von Class1 als auch alle Formulare und übergibt diesen das Class1-Objekt

Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.

J
222 Beiträge seit 2006
vor 17 Jahren

kann da auch eine statische klasse empfehlen
hier ein beispiel wo man was in einen string speichert und diesen später wieder ausließt


public static class CData
    {

        public static string MailSenderAdresse
        {
            get
            {
                string strBuffer = "irgendwer@irgendwo.com";
                return strBuffer;
            }
        }
    }

aufgerufen wird das ganze dann so:


CData.MailSenderAdresse;

hoffe ich konnte helfen 🙂

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo amdspeed,

Mh, also das ist eine ziemlich grundlegende Frage für alle OO-Sprachen

sehe ich genauso. Deshalb hier auch noch der Verweis auf http://www.galileocomputing.de/openbook/oo/

herbivore

187 Beiträge seit 2005
vor 17 Jahren

Original von Jabi
kann da auch eine statische klasse empfehlen
hier ein beispiel wo man was in einen string speichert und diesen später wieder ausließt

  
public static class CData  
    {  
  
        public static string MailSenderAdresse  
        {  
            get  
            {  
                string strBuffer = "irgendwer@irgendwo.com";  
                return strBuffer;  
            }  
        }  
    }  
  

aufgerufen wird das ganze dann so:

  
CData.MailSenderAdresse;  
  

hoffe ich konnte helfen 🙂

Ich würde den C# Anfänger nicht ins statische Messer laufen lassen. Ich rate generell immer von statischer Datenspeicherung ab. Der Zugriff auf diese Daten kann von jeder möglichen stelle folgen und die daten manipulieren.

Zu dir amdspeed.
Der link von Lord Hessia ist eins meiner liebsten. das buch hab ich mir gekauft und liegt rund um die uhr in bereitschaft ^^ leider ist die objektorientierung nur im niveau von Gesamtschul abi erklärt. Herbivore's link schickt dich gleich nach harvard und erklärt alles was objektorientierung angeht.

Zu deinem problem einpaar worte von mir: Diese klasse die du geschrieben hast, ist für laien verständlich doch nur eine schablone und schablonen malt man nicht voll, damit macht man kopien also unsere objekte. Diese Objekte füllst du mit Daten. Möchtest Du, dass diese Daten wo anders zur verfügung stehen musst du diese Daten weitergeben.

Es ist vielleicht blöd erklärt aber ich bin selbst noch weit davon entfernt einen lehrer darin spielen zu dürfen ^^ ich hab selbst ewig gebraucht bis ich das oo verstanden hab. Daher tief durchatmen und bücher lesen

amdspeed Themenstarter:in
10 Beiträge seit 2006
vor 17 Jahren

Hey super, vielen Dank schonmal für die ganzen Bemühungen, mir das mit den Klassen soweit zu erklären 🙂.

Ja, ich denke das Buch werde ich mir wohl auch kaufen, da ich auf den Link auch schon oft gestossen bin 8o . Steht denn in dem Buch noch mehr drin, als auf der Seite? (Ich gehe mal davon aus 😁 )

Noch eine kleine Frage zu den Klassen. Wenn ich jetzt eine Klasse aufrufen möchte, mache ich das ja mit folgendem Befehl:
CData.MailSenderAdresse; (vorrausgesetzt ich habe es auch so genannt 😉 )

Nur kann ich das ja so nur in einer Klasse aufrufen. Gibt es auch die Möglichkeit, die Klasse für das ganze Form1 zu laden. Wenn ja, wo muss der Befehl dann stehen?

Ein ganz großes Dankeschön an euch 🙂

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo zusammen,

Ich würde den C# Anfänger nicht ins statische Messer laufen lassen

cooler Spruch 😉 Gibts dann auch einen statischen Apfel, oder wofür ist das Messer sonst statisch? 😉

Nein, ganz im Ernst, Vassili hat hier vollkommen recht. Es gibt nur in Sonderspeziellensuperduperausnhmefällen eine statische Klasse. Der bevorzugte Weg sollte immer eine nicht statische Klasse sein.

Bei Konsolenanwendungen unter VisualStudio wird automatisch ein Template übernommen, das Anfängern die Verwendung von statischen Methoden und Klassen suggeriert:

using System;
using System.Collections.Generic;
using System.Text;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Das würde ich IMMER SOFORT so abändern:

using System;
using System.Collections.Generic;
using System.Text;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Program myApplication = new Program();
        }

        /// <summary>
        /// Constructor for test class.
        /// </summary>
        public Program()
        {
        }
    }
}

Dann kann man im Constructor fleißig üben und testen, und zwar OHNE STATISCHEN Ergänzungen.

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo amdspeed,

Steht denn in dem Buch noch mehr drin, als auf der Seite?

ich denke nicht, aber das sollte dich nicht hindern, dass Buch zu kaufen.

herbivore

G
87 Beiträge seit 2005
vor 17 Jahren

Soweit ich weiß, ist online immer die vorletzte Auflage verfügbar. Also die Auflage, die vor der aktuellen aktuell war. 😉 Die aktuelle Auflage (also die letzte) gibt es aber eben nur zu kaufen. Da sich aber so viel nun wirklich nicht ändert, und schon mal gar nicht an den Basics (um die es bei dir ja geht), reicht es erstmal, sich die Online-Version anzusehen. Allerdings fand ich es am Anfang angenehmer, die Basics in einem Buch nachzulesen, aber das ist eine Geschmacks- und Geldfrage.

N
750 Beiträge seit 2004
vor 17 Jahren

Allerdings fand ich es am Anfang angenehmer, die Basics in einem Buch nachzulesen, aber das ist eine Geschmacks- und Geldfrage.

ich lese sowas lieber online. aber das ist nun wirklich eine geschmacksfrage.
und vor allem nicht teil dieses threads 😉

?( wer suchet, der findet auch! :]

187 Beiträge seit 2005
vor 17 Jahren

Original von amdspeed
Hey super, vielen Dank schonmal für die ganzen Bemühungen, mir das mit den Klassen soweit zu erklären 🙂.

Ja, ich denke das Buch werde ich mir wohl auch kaufen, da ich auf den Link auch schon oft gestossen bin 8o . Steht denn in dem Buch noch mehr drin, als auf der Seite? (Ich gehe mal davon aus 😁 )

Noch eine kleine Frage zu den Klassen. Wenn ich jetzt eine Klasse aufrufen möchte, mache ich das ja mit folgendem Befehl:
CData.MailSenderAdresse; (vorrausgesetzt ich habe es auch so genannt 😉 )

Nur kann ich das ja so nur in einer Klasse aufrufen. Gibt es auch die Möglichkeit, die Klasse für das ganze Form1 zu laden. Wenn ja, wo muss der Befehl dann stehen?

Ein ganz großes Dankeschön an euch 🙂

Steht im Buch. Zugriffsberechtigungen oder so heisst das.
Da gibt es mehrere ebenen. Mir fallen jetzt nur zwei ein ^^
Klassenweit,
lokale variable

code beispiel:

class MyClass
{
   private bool KlassenweiteVar;
   private void MyVoid()
   {
      private bool LokaleVariable = true;
   }
}
amdspeed Themenstarter:in
10 Beiträge seit 2006
vor 17 Jahren

Original von Vassili

Steht im Buch. Zugriffsberechtigungen oder so heisst das.
Da gibt es mehrere ebenen. Mir fallen jetzt nur zwei ein ^^
Klassenweit,
lokale variable

code beispiel:

class MyClass  
{  
   private bool KlassenweiteVar;  
   private void MyVoid()  
   {  
      private bool LokaleVariable = true;  
   }  
}  

Jaaa, so wird eine Klasse angelegt. Nun möchte ich aber wissen, wie ich die Klasse aufrufen kann? Ich würde es jetzt so machen: MyClass.MyVoid;
Ist das so richtig? X(

Dank schonmal.

L
497 Beiträge seit 2006
vor 17 Jahren

Das würde nur bei einer statischen Klasse funktionieren.
Bei nicht statischen Klassen musst Du zunächst ein Objekt anlegen und auf diesem die Methode aufrufen.
Class1 objektVonClass1 = new Class1();
objektVonClass1.MyVoid();

=> s. z.B. auch Kapitel 6 in diesem Buch: http://www.galileocomputing.de/openbook/csharp/

Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.

1.433 Beiträge seit 2006
vor 17 Jahren

Noch ne weitere Buchempfehlung. Bin gerade selber dran 😁Visual C# 2005

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

187 Beiträge seit 2005
vor 17 Jahren

Ich sag ja probieren geht über studieren. Das problem ist, du weisst noch garnicht, was du probieren sollst.

Zur Info, damit du Objekte von Klassen unterscheidest.

Objekte erzeugst du von Klassen, welche du schreibst.
Klassen sind im Prinzip Vorlagen für Objekte (natürlich wenn nicht abstrakt, aber das sollten wir erstmal überspringen).

Und noch was hinterher. C# ist nicht C++ like. Jedes Objekt muss von Hand erzeugt werden.

als kleine Veranschaulichung

class MyClass
{
	public int Wert;
	
	void MyMethod()
	{
		MyClass oMyClass1 = new MyClass();
		oMyClass1.Wert = 10;
		MyClass oMyClass2 = new MyClass();
		oMyClass2.Wert = 20;
		oMyClass1 = new MyClass();
		oMyClass1.Wert = 30;
	}
}

In diesem Beispiel hab ich von der Klasse MyClass Objekte erzeugt. Es macht absolut nix aus, dass er von sich selbst ein Objekt erzeugen kann. Ehrlich gesagt, macht er nicht aus sich selbst ein Objekt sondern nur von der klasse, denn man selbst ist nur ein Objekt und kann nicht aus sich selbst ein Objekt erstellen sondern nur von Klassen. Egal.

Ich habe in der ersten zeile einen Objektverweis deklariert, nämlich oMyClass1 vom Typ MyClass. Außerdem erstelle ich gleich ein Objekt der Klasse MyClass und stelle den Verweis zu dem Objekt in mein Objektverweis oMyClass1.
Zweite Zeile. Ich fülle das Objekt in meinem Objektverweis. Der Objektverweis "Wert" (ja es ist ein verweis, denn selbst der integer ist eine klasse und wird zur erzeugung von objekten (int) benötigt) erhält den Wert 10.
die dritte zeile ist gleich der ersten, aber ich erstelle ein weiteres objekt, dessen verweis ich in einem neuen objektverweis speicher. Du musst dir merken, dass das objekt in oMyClass1 mit dem objekt in oMyClass2 nichts zu tun hat. Daher passiert in der vierten zeile nichts anderes, als dass das objekt in omyclass2 den Wert 20 bekommt und oMyClass1 nicht berührt wird. der Wert 10 bleibt für oMyClass1.
Zeile 5. Der Verweis oMyClass1 wird mit einem anderen Verweis gefüllt. und zwar mit einem eines neuen Objekts. Ich erstelle wieder eins und fülle in der sechsten Zeile mein drittes objekt mit dem Wert. generell musst du dir merken, dass wenn kein objektverweis auf ein objekt verweist (^^ zungenbrecher) der garbagecollector anspringt und dieses objekt zerstört, denn es wird nicht mehr verwendet. Da wir nirgends ein Objektverwes zu unsem ersten Objekt haben, wird dieses früher oder später von der garbagecollection (Müllabfuhr kannste dazu auch sagen) abgeholt und liquidiert 😉

Schlauer?

amdspeed Themenstarter:in
10 Beiträge seit 2006
vor 17 Jahren

Mhh, ich werde wenn ich heute Abend nach Hause komme, sehr sehr viele Sachen von hier ausprobieren ^^. Nur weiss ich nicht, ob mein eigentliches Problem schon geklärt wurde. Ich glaube das mein Problem, sehr einfach zu lösen ist. z.B. Habe ich drei boolean Variablen, einen Integer und die Werte möchte ich in allen Windows Forms aufrufen. So weit ja in Ordnung.

NUR was muss ich jetzt in der Windows Form eingeben, damit die Variablen alle in diesem Windows Form verfügbar ist.

Wenn das schon beantwortet wurden ist, dann sry, weisst mich dann bitte auf die Antwort hin.

Ich freue mich schon auf heute Abend, die Sachen auszuprobieren.

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo amdspeed,

NUR was muss ich jetzt in der Windows Form eingeben, damit die Variablen alle in diesem Windows Form verfügbar ist.

Dein Ansatz mit einer eigenen Klasse ist gut. Bitte diese Werte NICHT in einer Windows-Form Klasse speichern. Mach eine eigene draus.

--> Das allerdings geht jetzt schon sehr viel weiter, ich möchte Dir aber keine schlechte Lösung mitgeben, daher wirds nun ein bissl komplizierter 😉

Was Du brauchst, ist eine Singleton Klasse. Die kannst Du jederzeit (sofern namespace oder Referenz vorhanden) "erstellen", und Du bekommst immer ein und das selbe Objekt mit Deinen (somit einmaligen) Werten als Instanz zurück.

Deine Singleton Klasse sieht dann so aus:



public class MySettings
{
   // Klassenvariablen
   private static MySettings m_Instance = null;

   // Konstruktor
   protected MySettings()
   {}

   // Die statische Methode, um immer dieselbe Instanz zu bekommen
   public static MySettings CreateInstance()
   {
      // ist denn schon eine Instanz vorhanden gewesen vorher?
      if (m_Instance == null)
      {
         // nein noch keine bisher, also eine neue muss her
         m_Instance = new MySettings();
      }
      
      // gib die einmalige Instanz als Wert zurück
      return m_Instance;
   }
}


Diese Klasse braucht dann noch Deine Variablen neben den vorhanden Bausteinen, z.B. so:



public class MySettings
{
   // Klassenvariablen
   private static MySettings m_Instance = null;

   private bool m_MEINENEUEVARIABLE = false;

   // Eigenschaften
   public bool MEINEBOOLEIGENSCHAFT
   {
      get { return m_MEINENEUEVARIABLE; }
      set { m_MEINENEUEVARIABLE = value; }
   }

   // Konstruktor
   protected MySettings()
   {}

   // Die statische Methode, um immer dieselbe Instanz zu bekommen
   public static MySettings CreateInstance()
   {
      // ist denn schon eine Instanz vorhanden gewesen vorher?
      if (m_Instance == null)
      {
         // nein noch keine bisher, also eine neue muss her
         m_Instance = new MySettings();
      }
      
      // gib die einmalige Instanz als Wert zurück
      return m_Instance;
   }
}


Variablennamen sollte man nicht groß schreiben, ich habs hier nur gemacht, dass es auffällt!

Anwenden kannst Du es dann folgendermaßen (irgendwo, z.B. in Deinen Formsklassen):


MySettings mySettingsInstance = MySettings.CreateInstance();
mySettingsInstance.MEINEBOOLEIGENSCHAFT = true;

Bitte probiere das aus, und versuche es unbedingt zu verstehen, wenn Du das verstanden hast, dann bist du in Sachen Objektorientierung sehr viel weiter gekommen.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

amdspeed Themenstarter:in
10 Beiträge seit 2006
vor 17 Jahren

Ich wuensche euch allen einen wunderschönen guten Abend (endlich zu Hause ^^) 🙂

So, nun zu meinem Problem. Ich hoffe das ich euch nicht schon nerve. Nur lässt mich das wirklich keine Ruhe 😦.

Ich habe folgenden Code in meiner Class1:


using System;

namespace Ritterbecks
{
	/// <summary>
	/// Zusammenfassung für Class1.
	/// </summary>
	public class Class1
	{
		public void MyVoid()
			{
		Form1 Fo1 = new Form1();
		Form2 Fo2 = new Form2();
		Form3 Fo3 = new Form3();
	}}}

Und folgenden Code habe ich in meinem Form1:


private void button1_Click(object sender, System.EventArgs e)
		{
			Class1 objektVonClass1 = new Class1();
			objektVonClass1.MyVoid();
			Fo2.Closed += new EventHandler (showaction);
			Fo2.Show();
			this.Hide();
			Fo2.Location=this.Location;
		}

Leider funktioniert das nicht, als Fehlermeldung steht da:
"Der Typ oder Namespace 'Fo2' konnte nicht gefunden werden. Möglicherweise fehlt eine Anweisung oder ein Assemblyverweis."

Wenn ich die Klasse und die Methode "static" mache, dann steht da:
"Der Modifizierer 'static' ist für dieses Element nicht gültig"

Bitte, lasst mich das so mit den Forms machen und gibt mir keinen Link zu euren FAQ's, da ich die Klassenfunktion auch noch fürandere Ideen brauche.

Noch eine kleine Frage zum Schluss, was denn genau der Unterschied zwischen static und halt nicht ist?

Ich schätze eure bisherige Arbeit wirklich sehr und freue mich über jede Antwort, von euch hier 🙂
P.S. Die Shirts im Shop gefallen mir 😉

1.373 Beiträge seit 2004
vor 17 Jahren

Hallo,

Vielen Dank für deine freundlichen Art. Ist ja richtig Balsam für geschundene Moderatorenseelen 😁

Zu deinem Thema: Die Variablen, die du in MyVoid deklarierst, sind lokale Variablen. Sie verlieren ihre Gültigkeit, sobald der aktuelle Anweisungsblock (hier: die Methode) verlassen wird. Zudem sind sie von außerhalb der Methode nie erreichbar. Deshalb erhälst du die Fehlermeldung, dass Fo1 nicht gefunden werden kannst. Du kannst Daten auf verschiedene Arten mit einem Objekt und seinen Methoden austauschen z.B. über Methodenparameter oder über Membervariablen in der Klasse.

Der "static"-Modifierer macht eine Methode statisch (klare Sache). Eine nicht-statische Methode wird immer für eine bestimmte Instanz der entsprechenden Klasse ausgeführt. Diese Instanz ist dann über das Schlüsselwort "this" innerhalb der Methode ansprechbar. Um sie aufzurufen, benötigt man also eine Instanz einer Klasse (damit das Programm zur Laufzeit weiß, auf welches Objekt sich das "this" bezieht"); etwa wie bei deinem objektVonClass1.MyVoid();. Eine statische Methode ist nicht an eine Instanz, sondern an den Typen (die Klasse) gebunden. Man braucht kein Objekt des Typs, um sie aufzurufen. Dafür kann sie aber selbst nur wiederum auf statische Member der Klasse zugreifen.

Das ganze wird dir in einem entsprechenden einführenden Buch noch mal ausführlich beschrieben (Vorschläge sind ja hier bereits genannt worden). Schau dir einfach eines der Bücher genauer an. So lernt man die Grundlagen auf die sanfte Tour. Ich weiß, am Anfang will man hauptsächlich erst mal "machen" (ist ja auch ok: Versuch macht klug!), aber zu Beginn ein solides Rüstzeug zu erlangen ist wichtig für deinen Werdegang als C#-Programmierer.

Viele Grüße,
Andre

amdspeed Themenstarter:in
10 Beiträge seit 2006
vor 17 Jahren

Vielen Dank für die schnelle Antwort 🙂 ,

aber wie erstelle ich denn so eine Member Variable oder wie muss ich den Code bei der Deklaration ändern, damit es eine Membervariable ist?

*Edit*

Ich möchte das nur das ich alle Windows Forms aus der Klasse ansprechen kann. Ich habe schon versucht "public" davor zu setzten, dass nimmt er aber gar nicht an. Also bei dieser Zeile:
Form1 Fo1 = new Form1();

Ich weiss wirklich nicht mehr weiter.
Ich gehe jetzt mal was essen und dann wahrscheinlich schlafen 🙂.

187 Beiträge seit 2005
vor 17 Jahren

Guten morgen (in feierstimmung ^^)

da ich morgen vermutlich erst sehr spät wieder zu den lebenden zählen werde gibts jetzt eine kleine erklärung.


public class Class1
{
//Klassenweite Variable mit public. also auc hvon außen.
    public Form1 Fo1;
    public Form2 Fo2;
    public Form3 Fo3;

//Konstruktur
    public Class1()
    {
        Fo1 = null;
        Fo2 = null;
        Fo3 = null;
    }
//Meine Methode
    public void MyVoid()
    {
        Fo1 = new Form1();
        Fo2 = new Form2();
        Fo3 = new Form3();
    }
}

private void button1_Click(object sender, System.EventArgs e)
{
    Class1 objektVonClass1 = new Class1();
    objektVonClass1.MyVoid();
    objectVonClass1.Fo2.Closed += new EventHandler (showaction);
    objectVonClass1.Fo2.Show();
    this.Hide();
    objectVonClass1.Fo2.Location=this.Location;
}

klar? ^^

Junge, du musst dir lektüre reinpfeiffen. Bevor du dieses Problem gelöst hast, tauchen zwei weitere auf und das führt zum snowball effekt. mir fällt ein tolles spiel ein, dass wir spielen könnten. Wenn du es schaffst mir zu erklären, was ich an deinem code geändert habe, und warum, dann darfst du wieder neue threads öffnen ^^ nichternstnehmendenaltenvassili

amdspeed Themenstarter:in
10 Beiträge seit 2006
vor 17 Jahren

Hey super, vielen vielen Dank.... Das hat super funktioniert... Jetzt werde ich ersteinmal lesen ^^. Ihr seid echt super hier 🙂.