Grundlagen der Vererbung (:) Syntax
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 19 von 70.
Vererbung ermöglicht es einer Klasse, die Eigenschaften und Methoden einer anderen Klasse zu übernehmen. Anstatt denselben Code neu zu schreiben, erstellen Sie eine Basisklasse (Elternklasse) mit gemeinsamer Funktionalität und erstellen dann abgeleitete Klassen (Kindklassen), die von ihr erben.
In C# verwenden Sie den Doppelpunkt : als Symbol, um Vererbung anzuzeigen:
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}Die Klasse Dog erbt alles von Animal. Sie hat Zugriff auf die Eigenschaft Name und die Methode Eat(), ohne sie erneut zu deklarieren, zudem fügt sie ihre eigene Methode Bark() hinzu:
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // Ausgabe: Buddy frisst.
myDog.Bark(); // Ausgabe: Buddy sagt Wuff!C# unterstützt nur Einzelvererbung, was bedeutet, dass eine Klasse von nur einer Basisklasse erben kann. Sie können jedoch Vererbungsketten aufbauen, bei denen eine abgeleitete Klasse zur Basis für eine andere Klasse wird. Dies schafft eine Hierarchie, die reale Beziehungen modelliert und gleichzeitig Ihren Code organisiert und wiederverwendbar hält.
Aufgabe
EinfachLassen Sie uns eine Fahrzeughierarchie aufbauen, die zeigt, wie Vererbung es abgeleiteten Klassen ermöglicht, Funktionalitäten einer Basisklasse zu teilen und gleichzeitig ihr eigenes, einzigartiges Verhalten hinzuzufügen.
Sie werden drei Dateien erstellen, um Ihren Code zu organisieren:
Vehicle.cs: Definieren Sie eineVehicle-Klasse im NamespaceTransport. Dies wird Ihre Basisklasse sein, die alle Fahrzeuge gemeinsam haben. Sie sollte eine EigenschaftBrand(string) und eine EigenschaftYear(int) haben, zusammen mit einer MethodeStartEngine(), die"{Brand} engine started."ausgibt.Car.cs: Definieren Sie eineCar-Klasse im NamespaceTransport, die vonVehicleerbt. Das Auto fügt seine eigene EigenschaftNumberOfDoors(int) und eine MethodeHonk()hinzu, die"{Brand} goes Beep Beep!"ausgibt.Program.cs: Erstellen Sie in Ihrer Hauptdatei eineCar-Instanz unter Verwendung von Eingabewerten. Setzen Sie deren Eigenschaften (einschließlich der geerbten), und zeigen Sie dann, dass das Auto sowohl seine eigenen Methoden als auch die vonVehiclegeerbten Methoden nutzen kann.
Sie erhalten drei Eingaben:
- Markenname (Brand)
- Jahr (Year)
- Anzahl der Türen (Number of doors)
Geben Sie die Informationen des Autos aus und demonstrieren Sie seine Fähigkeiten in diesem Format:
Car: {Brand} ({Year})
Doors: {NumberOfDoors}
{StartEngine output}
{Honk output}Wenn die Eingaben beispielsweise Toyota, 2022 und 4 sind, sollte die Ausgabe wie folgt aussehen:
Car: Toyota (2022)
Doors: 4
Toyota engine started.
Toyota goes Beep Beep!Beachten Sie, wie Ihr Car auf die Eigenschaft Brand und die Methode StartEngine() zugreifen kann, obwohl diese in Vehicle definiert sind. Das ist die Stärke der Vererbung – die abgeleitete Klasse erhält automatisch alles von ihrer Basisklasse!
Spickzettel
Vererbung ermöglicht es einer Klasse, Eigenschaften und Methoden von einer anderen Klasse unter Verwendung des Doppelpunkt-Symbols : zu übernehmen:
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}Die abgeleitete Klasse (Dog) erbt alle Eigenschaften und Methoden von der Basisklasse (Animal) und kann eigene hinzufügen:
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // Vererbte Methode
myDog.Bark(); // Eigene MethodeC# unterstützt nur Einzelvererbung – eine Klasse kann von nur einer Basisklasse erben. Sie können jedoch Vererbungsketten erstellen, um Hierarchien aufzubauen.
Probier es selbst
using System;
using Transport;
class Program
{
public static void Main(string[] args)
{
// Eingabe lesen
string brand = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
int doors = Convert.ToInt32(Console.ReadLine());
// TODO: Erstelle eine Car Instanz
// TODO: Setze die Eigenschaften des Autos (Brand, Year, NumberOfDoors)
// TODO: Gib die Informationen des Autos im erforderlichen Format aus:
// Car: {Brand} ({Year})
// Doors: {NumberOfDoors}
// Rufe dann StartEngine() und Honk() auf
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten