Einführung


In diesem Tutorial lernst du, was Vererbung ist und wie du Vererbung nutzen kannst, um weniger Code schreiben zu müssen und eine sauberere Struktur zu haben.

Vorbereitung


Öffne Visual Studio und erstelle eine neue Konsolenapplikation (Console Application). Nun wurde das Projekt erstellt und bereits die Program.cs Datei geöffnet. Wird die App mit dem grünen Startbutton (oder mit F5) gestartet öffnet sich ein Konsolenfenster und der Code in der Main Methode wird aufgerufen.

Auf der Suche nach weiteren C# Tutorials?

Hier entlang

Los geht's!


Vererbung bedeutet, dass du von anderen Klassen ableitest und so alles von dieser Klasse auch verwenden kannst, ohne dass du den Code ein zweites Mal schreiben musst. So kannst du Teile, die du mehrmals verwendest in Basisklassen zusammenfassen und dann mit spezifischen Properties oder Methoden erweitern.

Hier ist ein Beispiel:

public class Student { public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } public int SchoolYear { get; set; } }
text/x-csharp
public class Teacher { public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } public string Subject { get; set; } }
text/x-csharp

Wie man sieht, haben wir hier eine Schüler und eine Lehrer Klasse. Beide haben einen Nachnamen, Vornamen und eine Adresse. Der Lehrer hat zudem noch ein Fach, welches er unterrichtet, dafür hat ein Schüler das Schuljahr, indem er ist.

Hier könnte man eine PersonBase Klasse einführen, welche jene Properties beinhaltet, welche Lehrer und Schüler gemeinsam haben, das könnte dann etwa so aussehen:

public class PersonBase { public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } }
text/x-csharp

Nun kann man Teacher und Student einfach von dieser PersonBase Klasse erben lassen. Das macht man, indem man nach dem Klassennamen " : PersonBase" schreibt. Nun kannst du alle Properties, welche bereits in der PersonBase Klasse vorhanden sind vom Schüler und Lehrer entfernen.

public class Teacher : PersonBase { public string Subject { get; set; } }
text/x-csharp
public class Student : PersonBase { public int SchoolYear { get; set; } }
text/x-csharp

Da Student bzw. Teacher beide von PersonBase abgeleitet werden, haben sie auch alle Properties, die in PersonBase definiert sind. Das spart Code und schafft eine bessere Codequalität.

Nun fügen wir in die PersonBase Klasse eine Funktion hinzu:

public void Write() { Console.WriteLine($"{FirstName} ${LastName} wohnt hier: ${Address}"); }
text/x-csharp

Sowohl Student als auch Teacher haben jetzt auch die Funktion von der PersonBase Klasse, aber was ist, wenn wir beim Lehrer etwas anderes ausgeben wollen?

Dafür musst du die Methode der PersonBase Klasse zuerst mit "virtual" markieren, um zu zeigen, dass diese überschrieben werden kann.

Dann kannst du in der Teacher Klasse die Methode mit "override" überschreiben, das sieht so aus:

public class PersonBase { /* Properties hier */ public virtual void Write() { Console.WriteLine($"{FirstName} ${LastName} wohnt hier: ${Address}"); } }
text/x-csharp
public class Teacher : PersonBase { /* Properties hier */ public override void Write() { Console.WriteLine($"{FirstName} ${LastName} unterrichtet das Fach ${Subject}"); } }
text/x-csharp

Manchmal möchte man aber die Methode der Basisklasse aufrufen und nur etwas zusätzlich dazu machen. Dafür kannst du "base.METHODE" verwenden. Base ist eine Variable, welche die Instanz der Basisklasse ist. Wenn wir also base.Write() ausführen, dann führen wir die Methode aus, welche in der PersonBase Klasse definiert ist. So können wir zusätzlich zum Code der Basisklasse spezifischen Code ausführen:

public class Student : PersonBase { public int SchoolYear { get; set; } public override void Write() { Console.WriteLine("Dieser Code wird vor der Basismethode ausgeführt"); base.Write(); // Führt die Methode in der Basisklasse aus Console.WriteLine($"Diese Person ist ein Schüler im {SchoolYear}.Jahr"); } }
text/x-csharp

Natürlich kann man auch Constructor beim Vererben nutzen.

Fügen wir also folgenden Constructor in unserer Basisklasse hinzu:

public PersonBase(string FullName) { var NameSplit = FullName.Split(' '); // Macht aus "Max Mustermann" eine Liste aus "Max" und "Mustermann" FirstName = NameSplit[0]; // Setzt den Vornamen auf "Max" LastName = NameSplit[1]; // Setzt den Nachnamen auf "Mustermann" }
text/x-csharp

Nun müssen wir bei Student und Teacher einen Constructor hinzufügen, der den Constructor der Basisklasse aufruft.

public Teacher(string FullName) : base(FullName) { // Hier könntest du natürlich auch noch Code schreiben }
text/x-csharp
public Student(string FirstName, string LastName) : base($"{FirstName} ${LastName}") { // Hier könntest du natürlich auch noch Code schreiben }
text/x-csharp

Schreibe nach dem Constructor einfach " : base(PARAMETER)" und gib alle nötigen Parameter mit, um die Basisklasse zu initialisieren.

Der Constructor von Teacher nimmt hier als Parameter den vollen Namen und gibt ihn einfach an die Basisklasse weiter.

Der Constructor von Student nimmt hier als Parameter den Vor- und Nachnamen, fügt beide zusammen und gibt diesen String dann an die Basisklasse weiter. Natürlich ist das hier nur als Beispiel gedacht, denn wir fügen hier 2 Variablen zu einem einzigen String zusammen und teilen diesen dann wieder in unsere 2 Variablen auf.

Fügen wir hierzu einfach einen zweiten Constructor in unserer Basisklasse hinzu, welche den Vor- und Nachnamen getrennt nimmt:

public PersonBase(string FirstName, string LastName) { this.FirstName = FirstName; this.LastName = LastName; }
text/x-csharp

Nun können wir den Constructor vom Student wiefolgt anpassen:

public Student(string FirstName, string LastName) : base(FirstName, LastName) { // Hier könntest du natürlich auch noch Code schreiben }
text/x-csharp

Lust auf mehr Tutorials?

Klicke hier

Vollständiger Sourcecode


public class PersonBase { public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } public PersonBase(string FullName) { var NameSplit = FullName.Split(' '); // Macht aus "Max Mustermann" eine Liste aus "Max" und "Mustermann" FirstName = NameSplit[0]; // Setzt den Vornamen auf "Max" LastName = NameSplit[1]; // Setzt den Nachnamen auf "Mustermann" } public PersonBase(string FirstName, string LastName) { this.FirstName = FirstName; this.LastName = LastName; } public virtual void Write() { Console.WriteLine($"{FirstName} ${LastName} wohnt hier: ${Address}"); } }
text/x-csharp
public class Teacher : PersonBase { public string Subject { get; set; } public Teacher(string FullName) : base(FullName) { // Hier könntest du natürlich auch noch Code schreiben } public override void Write() { Console.WriteLine($"{FirstName} ${LastName} unterrichtet das Fach ${Subject}"); } }
text/x-csharp
public class Student : PersonBase { public int SchoolYear { get; set; } public Student(string FirstName, string LastName) : base(FirstName, LastName) { // Hier könntest du natürlich auch noch Code schreiben } public override void Write() { Console.WriteLine("Dieser Code wird vor der Basismethode ausgeführt"); base.Write(); // Führt die Methode in der Basisklasse aus Console.WriteLine($"Diese Person ist ein Schüler im {SchoolYear}.Jahr"); } }
text/x-csharp

Über Digital Dojo

Das Digital Dojo ist der virtuelle Übungsraum von COUNT IT.

Angehende Programmierer*innen, Code-Neulinge, Wiedereinsteiger*innen und Fortgeschrittene finden hier das nötige Rüstzeug für ihre Karriere.

Du möchtest deine Lehre bei COUNT IT starten? Dann bist du hier richtig - besiege deine Gegner im Dojo Game und sichere dir deine Lehrstelle!

Inspire your career.

Newsletter abonnieren

Der COUNT IT Newsletter liefert viermal jährlich interessante Neuigkeiten über das Unternehmen. Gleich anfordern!