Autor Beitrag
Syra
Hält's aus hier
Beiträge: 13

Windows 7 Ultimate x64
Visual C# 2010/Visual Studio 2012
BeitragVerfasst: Sa 17.08.13 18:33 
Nabend,

ich bräuchte ein wenig wenig Sonderunterricht in Sachen "Klassen" in C#.
Ich verstehe nicht wozu man sie braucht und wie man sie verwendet, lediglich wie man eine neue Klasse erstellt.

Ich hoffe mal wieder auf Hilfe & bedanke mich im Voraus :)
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Sa 17.08.13 20:08 
Das ist ein bisschen wie "wozu braucht man Computer" - weil mit ihnen kann man nichts was man nicht auch ohne sie könnte. Nur Rechnen Computer etwas schneller als Menschen ;-)

Klassen (und das Konzept OOP) hat sich entwickelt. Früher hat man einfach den ganzen Code hintereinander geschrieben, erst auf Lochkarten, danach auf anderen Medien. Um nicht unnötigerweise das gleiche doppelt zu schreiben, konnte man dann innerhalb des Codes springen. (Nicht nur deswegen natürlich.)

Das Problem dabei ist, man sieht nicht so gut wo irgendwelche Bereiche anfangen, aufhören und welcher Code jetzt auf welche Variablen zugreift. Also hat man "Funktionen" eingeführt. Das sind kleine Code-Blöcke, die mit bestimmten Eingabeparametern was ausrechnen. (nennt sich dann strukturierte Programmierung)

Das ging dann auch erstmal ganz gut, aber irgendwann werden das einfach verdammt viele Funktionen. Da erscheint es sinnvoll, diese zu gruppieren. (Z.B. indem man Prefixe benutzt: str_* sind Stringfunktionen, File_ Dateifkt. usw.) Das ist schon ganz gut, aber man kann immer noch beliebige Funktionen aufrufen, die man eigentlich gar nicht aufrufen sollte.

Und hier kommt OOP ins Spiel: Funktionen und die zugehörigen Daten sind gruppiert.

Das kann man gut finden oder nicht. (Es gibt Sprachen, da soll man explizit Funktionen und Daten entkoppeln...) In C# fand man das so toll, dass es gar nicht mehr anders geht. Man muss in einem Programm mindestens eine Klasse schreiben. Prinzipiell kannst du es auch dabei belassen und alles in eine Funktion hinein coden. Übersichtlich wird das aber nicht ;-)

Für diesen Beitrag haben gedankt: Syra
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 17.08.13 21:28 
Klassen sind auch "Schablonen" für Objekte.

Toll, Objekte, was ist das jetzt wieder?
Objekte sind sozusagen einzelne Individuen, die alle nach ihrer jeweiligen Klasse aufgebaut sind. Dabei können sie alle unterschiedliche Werte haben und sich unterschiedlich verhalten.

Ein schönes Beispiel ist das Auto.
Es gibt eine Klasse - also die Schablone - namens Auto. Es hat einen Motor, vier Räder, etc.
Ein Auto ist und bleibt ein Auto und das wird sich auch nicht ändern.
Wo sich nun die Werte ändern können, sind die Eigenschaften. So hat ein Auto die Eigenschaft Pferdestärke. Wenn das Auto nun beschleunigt - also wenn die Methode "Beschleunigen" aufgerufen wird, dann wird das Auto mit mehr Pferdestärken die selbe Geschwindigkeit in weniger Zeit erreichen.
In unserer Klasse Auto ist das auch so im Code hinterlegt. Wird der Methode eine Ziel-Geschwindigkeit überlegt, dann steigt die Geschwindigkeit des einen Objektes schneller, als bei dem anderen Objekt.
Sie sind unterschiedlich, aber immer noch Autos.

Wenn du dich umschaust, wirst du in der realen Welt unzählige Beispiele finden. Bäume, Häuser, Fahrräder und sogar Menschen.
Menschen sind immer Menschen, doch mit unterschiedlichen Eigenschaften, weshalb sie sich unterschiedlich verhalten und auch unterschiedlich aussehen. Dennoch sind wir Menschen.



Die Objektorientierte Programmierung ist also ein Weg, reale Dinge in einem Programm nachzubilden und dessen Funktionen darzustellen.
Ohne die OOP wäre das nicht möglich - zumindest weiß ich nicht, wie.

Für diesen Beitrag haben gedankt: Syra
Syra Threadstarter
Hält's aus hier
Beiträge: 13

Windows 7 Ultimate x64
Visual C# 2010/Visual Studio 2012
BeitragVerfasst: Sa 17.08.13 21:30 
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
Das ist ein bisschen wie "wozu braucht man Computer" - weil mit ihnen kann man nichts was man nicht auch ohne sie könnte. Nur Rechnen Computer etwas schneller als Menschen ;-)

...


Nungut, soweit hab ich das jetzt schonmal verstanden, also ist z.B. Console bei Console.WriteLine(); eine Klasse ?
Wenn ja, inwieweit hilft mir dies weiter, außer dass ich nun Methoden einer Klasse zuweise ?
Ich bräuchte nunmehr eine erklärung anhand von Code, bisher habe ich mit diesem Tutorial gearbeitet ( www.csharpme.de/klassen.php ), jedoch verstehe ich den code nicht.
ausblenden C#-Quelltext
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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Projekt1
{
      class Program
      {
            static void Main(string[] args)
            {
                  <span style="color: red">meineKlasse instanzMeineKlasse = new meineKlasse();
                  instanzMeineKlasse.meineMethode();
                  Console.ReadLine</span>();
            }
      }

      class meineKlasse
      {
            public void meineMethode()
            {
                  Console.WriteLine("Ausgabe!");
            }
      }
}


Der rote Teil ist mir am unverständlichsten.

EDIT: @Palladin007 - Kann ich mir das ganze als Schrank mit mehreren Schubladen Vorstellen ? Der Schrank hat unterschiedliche Arten von Schubladen mit unterschiedlichem Inhalt, aber es bleibt ein Schrank ?

Moderiert von user profile iconTh69: Vollzitat (Full Quote) entfernt.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 17.08.13 22:38 
Joa, so im Prinzip denke ich passt das Beispiel.


Eigentlich passt so ziemlich alles.

Ein Fernseher ist und bleibt ein Fernseher, egal ob er nun groß oder klein ist, flach oder ein Röhrenbildschirm. Die Klasse muss den Objekten nur diese Freiheiten ermöglichen. Wenn in dieser Klasse eine feste Größe vorgegeben ist, dann lässt die sich auch nicht ändern, aber dann könnte z.B. die Geschwindigkeit, mit der das Bild aktualisiert wird, variabel sein und so unterschiedliche Fernseher ermöglichen.


Aber auch wenn die Eigenschaften exakt gleich sind, sind es immer noch zwei verschiedene Objekte.

Stell dir mal vor, man könnte einen Gegenstand nach dem Vorbild eines anderen Gegenstandes exakt nachbauen. Es existiert wirklich überhaupt kein Unterschied, nicht im kleinsten Detail. Sie sind absolut gleich.
Dennoch sind es nicht die selben Gegenstände. Sie haben zwar die gleichen Eigenschaften, aber trotzdem kannst du beide anfassen und siehst zwei Stück.


Das ist wichtig, dass du das verstehst. Ein Objekt ist immer einzigartig, völlig egal wie die Eigenschaften sind. Da kannst du das eine Objekt komplett bis ins kleinste Detail kopieren, dennoch hast du ein zweites Objekt, das unabhängig vom Ersten ist.
Und die Klasse ist dabei die Schablone, die das Schema darstellt, wie diese Objekte aussehen.




Das hat den Vorteil, dass eine Methode bei einem Objekt, das nach einer bestimmten Klasse als Typ geschaffen wurde, davon ausgehen kann, dass Methoden und Eigenschaften immer vorhanden sind. Was in der Eigenschaft steht, oder was passiert, wenn die Methode ausgeführt wird, steht auf einem anderen Blatt. Wichtig ist: Sie sind da und bleiben auch da, völlig egal, welches Objekt.



Klassen erkennst du im Übrigen in Visual Studio an der Farbe. Die Compilertypen (Farbe) haben alle ein Gegenstück als Klasse. Die findest du, indem du einfach mal ein bisschen googlest, die MSDN-Doku sollte da genügend Informationen bieten.



Die Klasse Console stellt (wie der Name schon sagt) die Konsole dar, in der du Text ausgeben lassen kannst.
Dort kannst du die Eigenschaften verändern und die Konsole agieren lassen.
Doch hier ist sie keine Schablone, denn diese Klasse ist statisch, was bedeutet, dass keine Objekte davon erstellt werden können. Hier ist die Klasse Console wohl mehr zur Übersichtlichkeit gedacht. Jeder, der etwas mit der Konsole machen will, sucht die nötigen Funktionen in der Klasse, die die Konsole darstellt, nämlich Console.
Dennoch kann diese Klasse Eigenschaften haben, allerdings gelten sie immer und global, da sie fest an die Klasse gebunden sind. Lässt die Klasse zu, dass sie geändert werden, dann kann man sie ändern, wenn nicht, dann nicht. Aber sie können nur über die Klasse direkt geändert werden, denn Objekte sind nicht möglich.



PS zum Code:

Ich glaub, im Code-Feld kann nicht formatiert werden, aber ich weiß, was du meinst.

Hier darfst du aber nicht nach einem sinnvollen Grund suchen, das so zu lösen, denn da suchst du ewig. Das dient nur dazu, zu verstehen, wie man sie verwendet und wie sie arbeiten, diese Klassen.

Wahrscheinlich wirst du das mit der Zeit schon noch verstehen, wenn du etwas mehr Klassen gesehen haben.
Du kannst zur Übung ja mal eine Klasse Auto schreiben. Sie muss nicht funktionieren, schreib in jede Methode einfach als Kommentar rein, was sie können muss und schreibe folgendes dazu, damit der Compiler keinen Fehler mehr wirft:

ausblenden C#-Quelltext
1:
throw new NotImplementedException();					


Das wirft einen Fehler aus und wenn du irgendwo eine Methode aufrufst, wo das steht, dann würde das Programm abbrechen, sobald es diesen Punkt erreicht hat. Aber das ist erst einmal unwichtig, das dient nur, damit die nirgendwo irgendwelche Fehler sind, wenn ein Rückgabewert fehlt.

Was allerdings wichtig ist, ist, dass du dir mal vor Augen führst, was ein Auto aus macht. Denke nicht zu komplex und bilde ein ganzes Auto dar, das wird zu viel, aber große Eckpfeiler, wie man ein Auto erkennt und was es aus macht, kannst du ruhig schreiben.

Schreibe z.B. für die PS-Zahl folgendes:

ausblenden C#-Quelltext
1:
public int Pferdestärke { get; private set; }					


Das ist eine Eigenschaft. Wenn du das noch nicht kennst, wirst du garantiert noch kennen lernen.
Zur Verwendung: Schreibst du vor das get ein private, dann kann niemand den Wert lesen. Lässt du das private vor dem set, kann ihn niemand verändern. Lässt du beides weg, ist auch beides möglich. Entscheide, was sinnvoll ist.
Ich habe hier ein private vor dem set geschrieben, weil die PS ja in der Regel nicht mehr zu ändern sind.

Aber du könntest schreiben:

ausblenden C#-Quelltext
1:
public int TankStand { get; set; }					


Gibt den Stand an, wie voll der Tank ist. Das kann man ablesen oder ändern, indem man tanken geht.

Entscheide aber auch, was das Auto können soll. Es soll fahren können, also schreib eine Methode Fahren.
Oder du möchtest, dass man den Tank nicht einfach so simpel ändern kann, also mach set private und schreib eine Methode Tanken, die dann intern den Tank verändert.


Als vorläufige Klasse:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
class Auto
{
    public int Pferdestärke { get; private set; }
    public int TankStand { get; private set; }

    public void Fahren(int Geschwindigkeit)
    {
        // Bringt das Auto auf die Geschwindigkeit und fährt.
    }
    public void Tanken(int AnzahlLiter)
    {
        // Ändert die Eigenschaft TankStand und füllt damit den Tank.
    }
}



Schreib noch mehr dazu, bis sie komplex ist, du aber noch den Überblick hast. Dann schau mal, was dann aus der Klasse geworden ist.

Für diesen Beitrag haben gedankt: Syra
Syra Threadstarter
Hält's aus hier
Beiträge: 13

Windows 7 Ultimate x64
Visual C# 2010/Visual Studio 2012
BeitragVerfasst: Sa 17.08.13 23:03 
Ok, soweit denke ich verstanden.
Eine Klasse bindet sozusagen mehrere Funktionen zu einem "Bereich" in eine Gruppe,richtig ?
Haben Klassen programmiertechnisch gesehen überhaupt eine richtige Funktion, oder sehe ich es richtig, dass Klassen lediglich der Übersicht halber verwendet werden ?

Nehmen wir an ich schreibe mehrere Funktionen für ein Paintähnliche programm, liege ich dann damit richtig, dass ich lediglich diese Funktionen, weil sie nur in diesem bereich fungieren, der Klasse hinzufügen sollte ?
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 17.08.13 23:18 
Einerseits können sie als Gruppe dienen, jedoch ist das nur der kleinste Nutzen einer Klasse.

Der eigentliche Sinn besteht darin, dass die Klasse die Möglichkeit bietet, eine eigene kleine Welt zu schaffen, mit den eigenen Regeln und Inhalten.

Du kennst doch Minecraft, oder? Dort gibt es einige Tiere. Es wird also vermutlich die Klassen Schwein, Kuh, Huhn, etc. geben. Und nun kann man von dieser Klasse Objekte erstellen und verwenden.


Bei Paint, wenn du alles in eine Klasse schreiben willst, dann viel Spaß ;)

Aber was du machen könntest, ist eine Klasse Pinsel schreiben. Diese hat dann die Eigenschaften Farbe und Dicke.
Und die Methode Zeichne.

Für diesen Beitrag haben gedankt: Syra
Syra Threadstarter
Hält's aus hier
Beiträge: 13

Windows 7 Ultimate x64
Visual C# 2010/Visual Studio 2012
BeitragVerfasst: Sa 17.08.13 23:59 
Okay, also korrigiere ich mein Paint Beispiel mal.

Die oberklasse währe class paint.
Dazu könnte ich dann unterklassen wie class pinsel, class radieren, class ausschneiden, class farbe etc hinzufügen.
Somit ist für mich schonmal der nutzen der Gruppen genau definiert.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 18.08.13 00:39 
Farben sind in .NET schon definiert, das brauchst du nicht nochmal machen.

Ausschneiden ist eine Tätigkeit, die ich eher als Methode schreiben würde. Ich kenne das alte Paint nicht mehr, aber ich denke mal, bei dieser Methode reichen zwei diagonale Eckpunkte der Auswahlkastens um aus zu schneiden.

Solche einfachen Funktionen würde ich dann wieder in einer allgemeinen Klasse zusammen fassen.


Wirklich weiß ich aber gerade auch nicht, wie ich das Programm strukturieren würde und möchte jetzt auch keinen Blödsinn erzählen.


Schau dir doch lieber das Beispiel Bank an. Das ist meiner Meinung nach greifbarer und leichter zu strukturieren.
Das Ganze muss nicht total komplex sein, es muss nur die einfachen Dinge unterstützen, Überweisen, etc.
Das Thema Sicherheit ist erst einmal unwichtig.

Für diesen Beitrag haben gedankt: Syra
Syra Threadstarter
Hält's aus hier
Beiträge: 13

Windows 7 Ultimate x64
Visual C# 2010/Visual Studio 2012
BeitragVerfasst: So 18.08.13 01:06 
Guck mal bitte in deine Pns :)

Moderiert von user profile iconTh69: Vollzitat (Full Quote)entfernt.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 18.08.13 01:13 
Ruhig Blut, bin auch nur ein Mensch. ^^