Klassendefinition

Prozedurale und objektorientierte Programmierung

Bevor Klassen eingeführt wurden, gab es in Sprachen wie C keinen Klassenbegriff. Die Programmierweise ohne Klassen und Objekte, wie bei C, bezeichnet man als prozedurale Programmierung.

Prozedurale Programmierung: Ein Programm ist eine Folge von Anweisungen; der Fokus liegt auf der Optimierung der Ausführungsschritte.

Durch die Verfügbarkeit von Klassen lässt sich objektorientierte Programmierung umsetzen.

Objektorientierte Programmierung: Ein Programm besteht aus gekapselten Klassen. Der zentrale Gedanke: Daten sowie Funktionen zur Verarbeitung dieser Daten zu logisch zusammengehörigen Einheiten zusammenfassen. Diese Einheiten sind die Klassen (class).

Definition einer Klasse

Eine Klasse ist eine Datenstruktur mit gespeicherten Daten und ausführbarem Code. Es gibt zwei Gruppen von Mitgliedern:

  1. Datenmitglieder (Data Members): Speichern Objektattribute: Felder (Fields), Konstanten (Constants)
  2. Funktionsmitglieder (Function Members): Implementieren das Verhalten von Objekten: Methoden, Eigenschaften, Konstruktoren, Destruktoren, Operatoren, Indexer, Ereignisse

Eine Klasse ist eine Sammlung gekapselter, logisch verbundener Daten und Funktionen, um Dinge aus der realen oder abstrakten Welt abzubilden.

Kurz gesagt ist eine Klasse eine aus Daten und Funktionen aufgebaute Datenstruktur. Aus einer Klasse können Objekte erzeugt werden; über Objekte greift man auf Daten und Mitglieder zu, der Zugriff ist aber auch innerhalb der Klasse möglich.

Deklaration einer Klasse

Das Schlüsselwort class definiert lediglich eine Klassenvorlage, es erzeugt keine Objektinstanzen. Eine Vorlage besteht aus drei Teilen: Klassenname, Klassenmitglieder, Klasseneigenschaften.

Syntax

class Klassenname
{
    // Mitgliedsdeklaration (Felder, Methoden, Reihenfolge ist nicht vorgeschrieben)
}Code-Sprache: JavaScript (javascript)

Die Klassendeklaration wird oft auch als Klassendefinition (class definition) bezeichnet


class Program
{
    static void Main(string[] args)
    {
        AddCalculator addCalculator = new AddCalculator();
        SubCalculator subCalculator = new SubCalculator();
    }
}


class AddCalculator
{
    public int A { get; set; }
    public int B { get; set; }
    public int Add()
    {
        return A + B;
    }
}

class SubCalculator
{
    public int A { get; set; }
    public int B { get; set; }
    public int Subtract()
    {
        return A - B;
    }
}Code-Sprache: JavaScript (javascript)

In dem obigen Beispiel werden zwei Klassen deklariert: eine für Additionen, eine für Subtraktionen. Innerhalb der Main-Funktion des Hauptprogramms erstellen wir Instanzen dieser beiden Klassen zur Nutzung.

Inhalt stammt von foxdevelop.com

Klassendeklarationen müssen nicht von oben nach unten angeordnet sein. Sie können Klassen unten im Code definieren und sie in der darüberliegenden Main-Funktion aufrufen. Eine Klasse ist nur eine Vorlage bzw. ein Bauplan. Der Code läuft nicht streng von oben nach unten ab; die Ausführung beginnt bei Main, und das Programm sucht bei Bedarf die passende Klassenvorlage.

Klassenmitglieder

Felder (Fields)

Ein Feld ist eine zu einer Klasse gehörende Variable. Es kann ein eingebauter oder benutzerdefinierter Typ sein und unterstützt das Lesen und Schreiben von Daten.

Typ Feldname;
class MyClass
{
    int MyField; // Feld MyField vom Typ int
}Code-Sprache: JavaScript (javascript)

Wichtiger Unterschied zu C/C++: C# kennt keine globalen Variablen. Alle Felder müssen innerhalb eines Typs (Klasse oder Struktur) deklariert werden.

Regeln zur Feldinitialisierung

(1) Implizite Initialisierung (ohne Wertzuweisung)

Der Compiler weist automatisch den Standardwert des jeweiligen Typs zu; die Standardwerte unterscheiden sich je nach Typ.

int F1;    // Standardwert 0
string F2; // Standardwert nullCode-Sprache: JavaScript (javascript)

Die folgende Tabelle zeigt die Zuordnung von C#-Typen und Standardwerten für Felder. Diese Regel gilt nur für Felder; lokale Variablen müssen vom Entwickler manuell initialisiert werden.

Einfache Werttypen

DatentypStandardwertBeschreibung
sbyte0Vorzeichenbehafteter 8-Bit-Integer
byte0Vorzeichenloser 8-Bit-Integer
short0Vorzeichenbehafteter 16-Bit-Integer
ushort0Vorzeichenloser 16-Bit-Integer
int0Vorzeichenbehafteter 32-Bit-Integer
uint0Vorzeichenloser 32-Bit-Integer
long0LVorzeichenbehafteter 64-Bit-Integer
ulong0ULVorzeichenloser 64-Bit-Integer
float0.0fEinfachgenaue Gleitkommazahl
double0.0dDoppelgenaue Gleitkommazahl
decimal0.0mHochgenaue Dezimalzahl
char'\0' (Nullzeichen, ASCII 0)Einzelnes Zeichen
boolfalseBoolescher Typ
Enumeration EnumDas Enumerationselement zum zugrundeliegenden Integer 0Enumerationen basieren auf Ganzzahlen, Standardwert 0
Struktur structJedes Feld erhält seinen eigenen StandardwertBenutzerdefinierter Werttyp, vollständig genullt

Referenztypen

Alle Referenztypen besitzen einheitlich den Standardwert null. Das bedeutet, die Variable zeigt auf kein Objekt im Heap-Speicher.

Mit anderen Worten: Es ist keine gültige Speicheradresse abgelegt. Erinnern Sie sich an das vorherige Speicherdiagramm: Referenztypen speichern Heap-Adressen wie 000001 01010. Bei null ist keine gültige Adresse hinterlegt.

TypkategorieBeispieltypenStandardwert
Eingebaute Referenztypenstring, objectnull
Benutzerdefinierte Klasse classPerson Studentnull
Arrays (jede Dimension)int[], string[,]null
Delegaten / EreignisseAction, Func, benutzerdefinierter delegatenull
Schnittstelle interfaceJede Interface-Variablenull

Beispiele

string str;        // Standard null
Student jason;     // Benutzerdefinierte Klasse, Standard null
int[] arr;         // Array, Standard null
Action callback;   // Delegat, Standard nullCode-Sprache: JavaScript (javascript)

Nullable-Typen (Nullable / T?)

Hängt man an einen einfachen Datentyp ein Fragezeichen ?, entsteht ein neuer Typ, der auch ohne gültigen Wert existieren kann. Beispiel: int age; erhält ohne Zuweisung automatisch den Wert 0. Möchte man ausdrücken, dass gar kein Wert vorhanden ist, schreibt man int? age2;. age2 ist dann ein Nullable-Typ und kann mit null belegt werden: int? age2 = null;

Ein Nullable-Typ ist ein umhüllter ValueType mit dem Standardwert null, was „kein gültiger Wert“ bedeutet.

DeklarationssyntaxStandardwert
int? numnull
bool? flagnull
decimal? pricenull
class Test
{
    int a;      // automatisch 0
    string b;   // automatisch null
    bool c;     // automatisch false
}Code-Sprache: JavaScript (javascript)

(2) Explizite Initialisierung

Weisen Sie bei der Deklaration mit = einen Wert zu. Der zugewiesene Wert muss zur Kompilierzeit feststehen; zufällige Werte oder Benutzereingaben sind hier unzulässig.

int days = 25;
string word = "foxdevelop";Code-Sprache: JavaScript (javascript)
(3) Kurzschreibweise für mehrere Felder gleichen Typs

Mehrere Variablen gleichen Typs können durch Kommas getrennt gemeinsam deklariert werden. Verschiedene Typen dürfen nicht in einer Zeile gemischt werden

int player, blood = 25;
string title, subTitle = "hi welcome to foxdevelop.com";Code-Sprache: JavaScript (javascript)

Methoden (Methods)

Methodendefinition

Eine Methode ist ein benannter, wiederverwendbarer ausführbarer Codeblock, vergleichbar mit Memberfunktionen in C++. Bei Aufruf wird der interne Code ausgeführt, danach kehrt die Steuerung zum Aufrufer zurück. Man unterscheidet Methoden mit und ohne Rückgabewert.

Vier Bestandteile einer Methode

  1. Rückgabetyp: Bei fehlendem Rückgabewert wird void angegeben
  2. Methodenname
  3. Parameterliste: Die Klammern () sind auch ohne Parameter verpflichtend
  4. Methodenrumpf: Ausführbarer Code eingeschlossen in {}

class Program
{
    static void Main(string[] args)
    {
        Robot robot = new Robot();
        robot.SayHello();
    }
}


class Robot
{
    public void SayHello()
    {
        Console.WriteLine("Hello everyone");
        Console.WriteLine("Welcome to visit foxdevelop.com");
    }
}Code-Sprache: JavaScript (javascript)

Das Schlüsselwort public vor public void SayHello() ist ein Zugriffsmodifikator: Damit kann die Funktion von außerhalb der Klasse über Objektname.MethodeName aufgerufen werden. Fehlt public, gilt standardmäßig private. Private Methoden sind nur innerhalb der Klasse aufrufbar; von außen – auch über eine Instanz wie robot – nicht erreichbar.

Erstellen von Klassenvariablen und Instanzen

1. Grundeigenschaften von Referenztypen

Klassen zählen zu den Referenztypen. Der Speicher gliedert sich in zwei Bereiche:

  1. Stack: Speichert Referenzvariablen (Zeiger auf Speicheradressen)
  2. Heap: Speichert die eigentlichen Objektdaten

2. Schrittweise Erstellung eines Objekts

1 Nur Deklaration der Referenzvariable (nur Stack belegt, kein Objekt im Heap)
Robot robot; 
// Nur Speicherplatz für die Referenz im Stack reserviert, Wert undefiniert, kein Objekt im Heap
Code-Sprache: JavaScript (javascript)
Dieser Code erzeugt eine Variable im Stack zur Aufnahme einer Referenz auf Robot (Heap-Speicheradresse), diese ist zum Zeitpunkt null und leer.

2 Speicherzuweisung im Heap mit dem Operator new

new Typname();Code-Sprache: JavaScript (javascript)
  1. Reserviert Speicher im Heap und initialisiert alle Felder automatisch mit Standardwerten
  2. Gibt die Referenzadresse des Heap-Objekts zurück und weist sie der Stack-Variablen zu
robot = new Robot();
Code-Sprache: JavaScript (javascript)
class Program
{
    static void Main(string[] args)
    {
        Robot robot;
        robot = new Robot();
    }
}


class Robot
{
    void SayHello()
    {
        Console.WriteLine("Hello everyone");
        Console.WriteLine("Welcome to visit foxdevelop.com");
    }
}Code-Sprache: JavaScript (javascript)
3. Deklaration und Instanziierung in einer Zeile
Robot robot = new Robot();Code-Sprache: JavaScript (javascript)
class Program
{
    static void Main(string[] args)
    {
        Robot robot = new Robot();
    }
}Code-Sprache: JavaScript (javascript)

Klassendefinition

Previous:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert