Erkunden von vererbungsbasiertem Polymorphismus
Vererbungsbasiertes Polymorphismus basiert auf einer Klassenhierarchie, in der abgeleitete Klassen Verhalten und Eigenschaften von einer Basisklasse erben. Mit der Vererbungsbeziehung können Sie Objekte abgeleiteter Klassen als Objekte der Basisklasse behandeln. Wenn Sie Objekte abgeleiteter Klassen als Objekte der Basisklasse behandeln, können Sie Code schreiben, der mit mehreren Objekttypen funktioniert, ohne den spezifischen Typ zur Kompilierzeit zu kennen.
Im folgenden Codebeispiel wird der vererbungsbasierte Polymorphismus in C# veranschaulicht:
// Base class
public class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("The animal makes a sound.");
}
}
// Derived class Dog
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("The dog barks.");
}
}
// Derived class Cat
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("The cat meows.");
}
}
// Derived class Cow
public class Cow : Animal
{
public override void MakeSound()
{
Console.WriteLine("The cow moos.");
}
}
class Program
{
static void Main()
{
// Create an array of Animal objects
Animal[] animals = new Animal[3];
Animal animal1 = new Dog();
Animal animal2 = new Cat();
Animal animal3 = new Cow();
animals[0] = animal1;
animals[1] = animal2;
animals[2] = animal3;
// Demonstrate polymorphism
foreach (Animal animal in animals)
{
animal.MakeSound();
}
}
}
Beachten Sie in diesem Beispielcode, dass die Program-Klasse ein Array von Animal-Objekten erstellt und Instanzen von Dog, Cat und Cow den Arrayelementen zuweist. Die MakeSound-Methode wird für jedes Objekt im Array aufgerufen, das Polymorphismus demonstriert. Die MakeSound-Methode wird in den abgeleiteten Klassen überschrieben, um ein bestimmtes Verhalten für jeden Tiertyp bereitzustellen.
Umwandeln eines Objekts einer Basisklasse in ein Objekt einer abgeleiteten Klasse
Umwandlung in C# beschreibt die Konvertierung eines Objekts eines Typs in einen anderen Typ. Umwandlung wird häufig bei der Implementierung von Polymorphismus mithilfe von Vererbungshierarchien verwendet, bei denen Sie über eine Basisklasse und eine oder mehrere abgeleitete Klassen verfügen.
Es gibt zwei Haupttypen von Umwandlungen:
Implizite Umwandlung: Dies geschieht automatisch beim Konvertieren einer abgeleiteten Klasse in eine Basisklasse. Dieser Prozess ist sicher, da jede Instanz einer abgeleiteten Klasse auch eine Instanz der Basisklasse ist.
BankAccount account = new CheckingAccount();Explizite Umwandlung: Dies erfordert einen Umwandlungsoperator und wird verwendet, wenn eine Basisklasse in eine abgeleitete Klasse konvertiert wird. Dieser Prozess ist nicht immer sicher, da nicht jede Instanz einer Basisklasse eine Instanz der abgeleiteten Klasse ist.
CheckingAccount checkingAccount = (CheckingAccount)account;
Umwandeln von Objekten mithilfe der Schlüsselwörter is und as
In C# können Sie Objekte mithilfe der Schlüsselwörter is und as umwandeln. Diese Schlüsselwörter bieten eine sichere Möglichkeit, den Typ eines Objekts zu überprüfen, bevor man es in einen anderen Typ umwandelt. Im Folgenden finden Sie einige gängige Methoden zum Umwandeln von Objekten in C#:
Verwenden des Schlüsselworts
ismit Musterabgleich:if (account is CheckingAccount checkingAccount) { // Use checkingAccount as a CheckingAccount }- Diese Syntax überprüft, ob
accountvom TypCheckingAccountist. - Wenn die Überprüfung erfolgreich ist, wandelt sie
accountinCheckingAccountum und weist sie der VariablencheckingAccountzu. - Dieser Ansatz ist präzise und sicher, da er die Prüfung und Umwandlung des Typs in einem Schritt kombiniert.
- Diese Syntax überprüft, ob
Verwenden des Schlüsselworts
isgefolgt von expliziter Umwandlung:if (account is CheckingAccount) { CheckingAccount checkingAccount = (CheckingAccount)account; // Use checkingAccount as a CheckingAccount }- Diese Syntax überprüft, ob
accountvom TypCheckingAccountist. - Wenn die Überprüfung erfolgreich ist, wandelt sie
accountexplizit inCheckingAccountum und weist sie der VariablencheckingAccountzu. - Dieser Ansatz ist ausführlicher als die Syntax für den Musterabgleich, bietet jedoch mehr Kontrolle über den Umwandlungsprozess.
- Diese Syntax überprüft, ob
Verwenden des Schlüsselworts
as:CheckingAccount checkingAccount = account as CheckingAccount; if (checkingAccount != null) { // Use checkingAccount as a CheckingAccount }- Diese Syntax versucht,
accountinCheckingAccountumzuwandeln und weist das Ergebnis zucheckingAccountzu. - Wenn die Umwandlung erfolgreich ist, enthält
checkingAccountdas Umwandlungsobjekt; andernfalls ist es NULL. - Dieser Ansatz ist nützlich, wenn Sie das Umwandlungsergebnis überprüfen möchten, bevor Sie das Umwandlungsobjekt verwenden. Dies ist zum Beispiel der Fall, wenn Sie Ausnahmen vermeiden und Fehler ordnungsgemäß behandeln möchten.
- Diese Syntax versucht,
Beachten Sie bei der Implementierung von Umwandlungen die folgenden Richtlinien:
- Verwenden des Musterabgleichs mit
is: Kombiniert die Überprüfung und Umwandlung des Typs in einem Schritt. - Verwenden des Schlüsselworts
ismit expliziter Umwandlung: Unterteilt die Überprüfung und Umwandlung des Typs in zwei Schritte und bietet mehr Kontrolle über den Umwandlungsprozess. - Verwenden des Schlüsselworts
as: Versucht, Fehler ordnungsgemäß umzuwandeln und zu behandeln, indem der Wert NULL zurückgegeben wird.
- Verwenden des Musterabgleichs mit
Das Verständnis dieser Umwandlungstechniken ist für die Verwendung von Polymorphismus und der Vererbung in C# unerlässlich.
Vermeiden häufiger Fallstricke bei der Implementierung von Polymorphismus
Wenn Sie vererbungsbasiertes Polymorphismus verwenden möchten, finden Sie hier einige Punkte, die Sie vermeiden sollten, und einige Punkte, die Sie gewährleisten sollten:
Vermeiden Sie die Verwendung versiegelter Klassen und Methoden: Versiegelte Klassen und Methoden können nicht vererbt oder außer Kraft gesetzt werden, was die Verwendung von Polymorphismus begrenzt. Wenn Sie eine Klasse oder Methode versiegeln, verhindern Sie weitere Erweiterungen und Anpassungen. Beispiel:
public sealed class BankAccount { } // This class can't be inheritedVermeiden Sie die Überlastung statischer Methoden. Statische Methoden gehören zur Klasse selbst und nicht zu einer Instanz der Klasse. Sie können nicht überschrieben werden, sodass sie nicht für Polymorphismus geeignet sind.
public static void PrintMessage() { } // This method can't be overriddenVermeiden Sie eine enge Kopplung. Eine enge Kopplung tritt auf, wenn Klassen oder Komponenten in einem System stark voneinander abhängig sind. Dies bedeutet, dass Änderungen in einer Klasse sich direkt auf andere Klassen auswirken können, wodurch das System weniger flexibel und schwieriger zu verwalten ist. Eine enge Kopplung kann zu Problemen beim Testen, Erweitern und Ändern des Codes führen.
public class BankAccount { public void TransferFunds(SavingsAccount savingsAccount) { // Tight coupling with SavingsAccount } }Vermeiden Sie die Verwendung des Schlüsselworts „new“, wenn es nicht unbedingt erforderlich ist. Das Schlüsselwort „new“ blendet die Methode der Basisklasse in der abgeleiteten Klasse aus, was zu Verwirrung und unerwartetem Verhalten führen kann. Verwenden Sie das Schlüsselwort „new“ nur, wenn Sie die Methode der Basisklasse absichtlich ausblenden möchten.
public class Dog : Animal { public new void MakeSound() // Hides the base class method. Better to use 'override' { Console.WriteLine("The dog barks."); } }Stellen Sie eine konsistente Methodensignatur sicher. Stellen Sie sicher, dass überschriebene Methoden in abgeleiteten Klassen dieselbe Signatur wie die Basisklassenmethode aufweisen. Wenn Sie die Methodensignatur ändern, werden Methoden eher ausgeblendet als außer Kraft gesetzt.
public class Animal { public virtual void MakeSound(string sound) { Console.WriteLine("The animal makes a sound."); } } public class Dog : Animal { // Method signature doesn't match the base class public override void MakeSound() { Console.WriteLine("The dog barks."); } }
Zusammenfassung
Mit der vererbungsbasierten Polymorphie in C# können Sie eine Hierarchie von Klassen erstellen, in denen abgeleitete Klassen Verhalten und Eigenschaften von einer Basisklasse erben. Mit diesem Vererbungsmechanismus können Sie Objekte abgeleiteter Klassen als Objekte der Basisklasse behandeln. Mit der Möglichkeit, Objekte abgeleiteter Klassen als Member einer Basisklasse zu behandeln, können Sie Code schreiben, der mit mehreren Objekttypen funktioniert, ohne den spezifischen Typ zur Kompilierzeit zu kennen. Wenn Sie die Umwandlungstechniken verstehen, häufige Fallstricke vermeiden und bewährte Methoden umsetzen, können Sie Polymorphismus effektiv in Ihren C#-Anwendungen implementieren.