Grundlagen Teil 2 - Klassen

Klassen wurden im Tutorial bereits öfters erwähnt, vor allem wurde die Klasse Console bereits sehr häufig dazu verwendet, um mit der Konsole zu interagieren.
Vereinfach ausgedrückt ist eine Klasse eine Sammlung von Variablen und Methoden, um diese Später wiederverwenden zu können. Ein weiterer Vorteil ist die optische Abgrenzung, dadurch wird der Code deutlich übersichtlicher.
Das Programmieren einer einfachen Klasse ist keine große Herausforderung, jedoch werden wir diesen Abschnitt nutzen, um einige Schlüsselwörter kennenzulernen, welche auch für Methoden und Variablen Gültigkeit besitzen.

Allgemeines

Das Erstellen einer Klasse erfolgt durch das Schlüsselwort class, dies ist nichts anderes, als das englische Wort für Klasse, gefolgt vom Namen. Außerdem ist es auch legitim, eine Klasse in einer anderen Klasse zu erstellen.
Um dies besser zu verstehen, beleuchten wir nochmal den Programmcode, welcher von Visual C# beim erstellen eines Projektes erzeugt wird.

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

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

            }
      }
}

Die using Zeilen am Anfang, sind derzeit nicht von Bedeutung und werden erst später benötigt, daher verzichte ich in diesem Abschnitt darauf sie zu erläutern.
Kommen wir zum interessanten Teil dieses Programmcodes:

namespace Projekt1 { }
Bedeutet in das Deutsche übersetzt, nichts anders als Namensraum, vereinfacht ausgedrückt, wird dadurch das Projekt zusammengefasst. Der Name kann nachträglich verändert werden, standardmäßig wird von Visual C# der Projektname gewählt. Wenn wir später zu weiteren Programmdatein kommen, werden wir darauf achten müssen, den gleichen namespace zu verwenden.
Wie schon ganz zu Anfang des Tutorials erwähnt, fassen geschwungene Klammern immer etwas zusammen, in diesem Fall den gesamten Projektcode.

class Program { }
Wie bereits erwähnt, ist class das Schlüsselwort um eine Klasse zu erstellen und Program der Name. Beim erstellen einer Konsolenanwendung wird automatisch Program für die erste Klasse vergeben, dies lässt sich allerdings ändern und ist nicht vom System vorgegeben. Wieder wird der zur Klasse zugehörige Programmcode in geschwungenen Klammern zusammengefasst.

static void Main(string[] args) { }
Diese besondere Methode wurde bereits in letzten Abschnitt erklärt, es seih hier nochmal erwähnt, dass Main die Methode ist, die bei einem Programmstart zu Beginn aufgerufen wird.

Erstellen einer Klasse

Das Programmieren einer Klasse ist denkbar einfach, jedoch ist sie damit allein noch nicht verwendbar. Dazu ist es noch notwendig, zu wissen wie eine Klasse verwendet wird.
Bevor ich allerdings darauf eingehen, noch ein kurzes Programmbeispiel.

Ein Programm mit einer zweiten Klasse namens meineKlasse, ohne Methoden und Variablen würde folgendermaßen aussehen:

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

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

            }
      }

      class meineKlasse
      {

      }
}

In dieser Klasse, könnten Variablen und Methoden identisch wie in der Startklasse Program definiert/programmiert werden. Kommen wir nun zur Verwendung von Klassen.

Verwenden von Klassen

Ganz zu Anfang, hatten wir Klassen mit einer Schublade mit mehreren Fächern beschrieben, dabei allerdings eine wichtige Eigenschaft nicht erwähnt. Damals hatten wir die Klasse Console, wie einen Werkzeugkasten verwendet, jedoch sind Klassen noch viel mehr. Sie lassen sich beliebig vervielfachen, dies ist eine sehr praktische Eigenschaft. Um den Zweck besser zu erklären ein kleines Beispiel. Gehen wir davon aus, dass wir ein Programm schreiben wollen, dass mehrere Bankkonten verwaltet (Name, Nummer, Adresse,...). Es erspart einiges an Arbeit, wenn man einen Werkzeugkasten besitzt der all diese Elemente enthält und diesen danach beliebig vervielfältigt.

Kommen wir nun zur eigentlichen Verwendung.
Das Verwenden von Klassen verhält sich ähnlich dem von Variablen, man kann also beim Definieren eines neuen "Werkzeugkastens" den Namen der Klasse, wie den eines Variablentypen verwenden. Man nennt dies auch eine Instanz der Klasse.
Bevor ich dies mit einem Programmbeispiel nochmals genauer erkläre, ist es notwendig ein weiteres Detail kennenzulernen.

public / private

Diese zwei Schlüsselwörter können für Klassen, Methoden und Variablen vergeben werden. Dies ist eine Art Rechteverwaltung, public bedeutet soviel wie öffentlich zugänglich und private nicht öffentlich zugänglich. Dieser Zugang bezieht sich auf den Ort, an welchem ein Element verwendet werden kann. Standardmäßig sind Elemente immer private. Anders ausgedrückt, um eine Methode aus der selbstgeschriebenen Klasse verwenden zu können, muss public vor dem Methodennamen und der Angabe des Rückgabewertes stehen.
Eine weiterer Einzelheit, die bis jetzt nicht berücksichtigt wurde, ist das es erlaubt ist Variablen außerhalb von Methoden zu deklarieren, jedoch noch innerhalb der geschwungenen Klammern einer Klasse. Für diese gilt das gleiche Verhalten im Bezug auf public und private. Außerhalb der Klassen, lass sich diese wie Methoden durch Instanz.Variablenname aufrufen.
Nun folgt ein Programmbeispiel, anhand welchem es nochmal genauer erklärt wird.

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

namespace Projekt1
{
      class Program
      {
            static void Main(string[] args)
            {
                  meineKlasse instanzMeineKlasse = new meineKlasse();
                  instanzMeineKlasse.meineMethode();
                  Console.ReadLine();
            }
      }

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

Es wurde eine Klasse mit dem Namen meineKlasse durch class meineKlasse { } erstellt. In dieser Klasse wurde eine public (öffentliche) Methode mit dem Namen meineMethode erstellt, in der ein Text an die Konsole ausgegeben wird. Etwas, dass dabei auffällt ist das hier kein static vonnöten ist. Dazu gleich mehr.
Eine Instanz dieser Klasse wird genauso wie z.B.: bei einer int Variable erstellt. Jedoch wird danach ein new Klassenname() (Variablentyp) benötigt. Ist dies passiert, lassen sich die in der Klasse enthaltenen public Methoden und Variablen, durch Instanz.Methodennamen/Variablennamen aufrufen. Würde dieses Programm ausgeführt, hätte dies zur Folge, dass "Ausgabe!" in der Konsole angezeigt werden würde.

static

Bereits öfter erwähnt, aber bis jetzt nicht näher erklärt, ist der Begriff static. Dies heißt soviel wie statisch. Wie oben erwähnt, kann man mehrere Instanzen (Werkzeugkästen) einer Klasse erstellen, Methoden / Variablen welche static sind, werden dabei nicht mehrfach erstellt, sondern es handelt sich in allen Instanzen um die gleiche Methode / Variable. Um Bezug auf den Werkzeugkasten zu bekommen, stellen wir uns vor, dass es 10 Werkzeugkästen gibt und für alle existiert ein Hammer, den alle verwenden. Wieder auf das Programmieren bezogen gibt es alledings eine Besonderheit von static Methoden, diese können andere Methoden / Variablen nur aufrufen wenn diese auch static sind.

Übungsbeispiel

Die Aufgabe ist es diesmal, ein Programm zu programmieren welches folgende Angabe erfüllt.

Angabe

Für die Lösung hier klicken. Bei Fragen und Problemen, bitte das Forum benutzen.

Lösung:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Projekt1
{
      class Program
      {
            static void Main(string[] args)
            {
                  int eingabeZahl1 = Convert.ToInt32(Console.ReadLine());
                  int eingabeZahl2 = Convert.ToInt32(Console.ReadLine());
                  string rechenzeichen = Console.ReadLine();

                  rechner rechenMethoden = new rechner();

                  if(rechenzeichen=="+")
                  {
                        Console.WriteLine(rechenMethoden.addieren(eingabeZahl1,eingabeZahl2));
                  }
                  else if(rechenzeichen=="-")
                  {
                        Console.WriteLine(rechenMethoden.subtrahieren(eingabeZahl1,eingabeZahl2));
                  }
                  else
                  {
                        Console.WriteLine("Falsches Rechenzeichen!");
                  }
                  Console.ReadLine();
            }
      }

      class rechner
      {
            public int addieren(int zahl1, int zahl2)
            {
                  return zahl1+zahl2;
            }

            public int subtrahieren(int zahl1, int zahl2)
            {
                  return zahl1-zahl2;
            }
      }
}