Das 'base'-Schlüsselwort
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 20 von 70.
Wenn eine abgeleitete Klasse von einer Basisklasse erbt, müssen Sie oft direkt auf die Member der Basisklasse zugreifen. Das Schlüsselwort base stellt diese Verbindung bereit und ermöglicht es Ihnen, den Konstruktor der Basisklasse aufzurufen oder auf deren Methoden und Eigenschaften zuzugreifen.
Die häufigste Verwendung von base ist der Aufruf des Konstruktors der Basisklasse. Beim Erstellen eines abgeleiteten Objekts können Sie Werte an die Basisklasse übergeben:
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}Die : base(name)-Syntax ruft den Animal-Konstruktor auf, bevor der Rumpf des Dog-Konstruktors ausgeführt wird. Dies stellt sicher, dass die Basisklasse zuerst ordnungsgemäß initialisiert wird.
Sie können base auch verwenden, um Methoden der Elternklasse aus der abgeleiteten Klasse heraus aufzurufen:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // Ruft die Speak-Methode von Animal auf
Console.WriteLine("Woof!");
}
}Hier ruft base.Speak() explizit die Version der Methode der Basisklasse auf. Dies ist nützlich, wenn Sie das Verhalten der Basisklasse erweitern möchten, anstatt es vollständig zu ersetzen.
Aufgabe
EinfachLassen Sie uns ein Produktinventarsystem erstellen, das zeigt, wie abgeleitete Klassen das Schlüsselwort base verwenden, um ihre Basisklasse ordnungsgemäß zu initialisieren und geerbtes Verhalten zu erweitern.
Sie werden drei Dateien erstellen, um Ihren Code zu organisieren:
Product.cs: Definieren Sie eine KlasseProductim NamespaceInventory. Diese Basisklasse repräsentiert jedes Produkt mit einer EigenschaftName(string) und einer EigenschaftPrice(decimal). Fügen Sie einen Konstruktor hinzu, der beide Werte akzeptiert, sowie eine MethodeGetInfo(), die"{Name}: ${Price}"zurückgibt.ElectronicProduct.cs: Definieren Sie eine KlasseElectronicProductim NamespaceInventory, die vonProducterbt. Diese Klasse fügt eine EigenschaftWarrantyMonths(int) hinzu. Der Konstruktor sollte Name, Preis und Garantiemonate akzeptieren - verwenden Siebase, um den Namen und den Preis an den Konstruktor der Basisklasse zu übergeben. Erstellen Sie eine MethodeGetInfo(), die zuerst die MethodeGetInfo()der Basisklasse mittelsbaseaufruft und dann" (Warranty: {WarrantyMonths} months)"anhängt, um die Ausgabe zu erweitern.Program.cs: Erstellen Sie in Ihrer Hauptdatei einElectronicProductunter Verwendung von Eingabewerten und zeigen Sie dessen vollständige Informationen durch Aufruf vonGetInfo()an.
Sie erhalten drei Eingaben:
- Produktname
- Preis
- Garantiemonate
Geben Sie das Ergebnis des Aufrufs von GetInfo() für Ihr elektronisches Produkt aus.
Wenn die Eingaben beispielsweise Laptop, 999.99 und 24 sind, sollte die Ausgabe wie folgt lauten:
Laptop: $999.99 (Warranty: 24 months)Beachten Sie, wie die abgeleitete Klasse auf der Ausgabe der Basisklasse aufbaut, anstatt die Logik zu duplizieren. Das Schlüsselwort base ermöglicht es Ihnen, das Verhalten der Elternklasse nahtlos wiederzuverwenden und zu erweitern!
Spickzettel
Das Schlüsselwort base ermöglicht einer abgeleiteten Klasse den Zugriff auf Member ihrer Basisklasse.
Verwenden Sie base, um den Konstruktor der Basisklasse aufzurufen:
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}Die Syntax : base(name) ruft den Konstruktor der Basisklasse auf, bevor der Rumpf des Konstruktors der abgeleiteten Klasse ausgeführt wird, was eine ordnungsgemäße Initialisierung gewährleistet.
Verwenden Sie base, um Methoden der Basisklasse aus der abgeleiteten Klasse aufzurufen:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // Ruft Speak von Animal auf
Console.WriteLine("Woof!");
}
}Dies ermöglicht es Ihnen, das Verhalten der Basisklasse zu erweitern, anstatt es vollständig zu ersetzen.
Probier es selbst
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// Eingaben einlesen
string name = Console.ReadLine();
decimal price = Convert.ToDecimal(Console.ReadLine());
int warrantyMonths = Convert.ToInt32(Console.ReadLine());
// TODO: Erstelle ein ElectronicProduct mit den Eingabewerten
// TODO: Gib das Ergebnis des Aufrufs von GetInfo() für dein ElectronicProduct aus
}
}
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