Polymorphismus und dynamischer Dispatch
Verstehen Sie Polymorphismus: Rufen Sie virtuelle Member über eine Basisklassenreferenz auf, verwenden Sie Collections mit Basistypen, vermeiden Sie das Verbergen von Methoden und führen Sie bei Bedarf sichere Casts durch.
Polymorphismus und dynamischer Dispatch ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.
Überblick über Polymorphie
Ziel: Verwenden Sie einen Basistyp und lassen Sie abgeleitete Typen das Verhalten anpassen.
- Basisklassenreferenz, abgeleitetes Objekt
- virtual + override → dynamischer Dispatch
- Sammlungen mit Basistyp
- Vermeiden Sie das Verbergen von Methoden mit new
Grundlagen des dynamischen Dispatch
Beim Aufruf einer virtual-Methode wird der Laufzeittyp des Objekts verwendet, nicht der Compilezeittyp der Variablen.
using System;
public class Animal
{
public virtual string Speak() { return "???"; }
}
public class Cat : Animal
{
public override string Speak() { return "Meow"; }
}
public class Dog : Animal
{
public override string Speak() { return "Woof"; }
}
public class Program
{
public static void Main(string[] args)
{
Animal a1 = new Cat(); // base reference
Animal a2 = new Dog();
Console.WriteLine(a1.Speak()); // Meow
Console.WriteLine(a2.Speak()); // Woof
}
}
Polymorphie in Sammlungen
Speichern Sie verschiedene abgeleitete Typen in einer List<Base> und rufen Sie virtuelle Member einheitlich auf.
using System;
using System.Collections.Generic;
public class Shape
{
public virtual double Area() { return 0.0; }
}
public class Rectangle : Shape
{
private readonly int _w, _h;
public Rectangle(int w, int h) { _w = w; _h = h; }
public override double Area() { return _w * _h; }
}
public class Circle : Shape
{
private readonly int _r;
public Circle(int r) { _r = r; }
public override double Area() { return 3.14159 * _r * _r; }
}
public class Program
{
public static void Main(string[] args)
{
List<Shape> shapes = new List<Shape>();
shapes.Add(new Rectangle(3, 4));
shapes.Add(new Circle(2));
foreach (Shape s in shapes)
{
Console.WriteLine("Area = " + s.Area()); // calls correct override
}
}
}
Verbergen oder Überschreiben
Vermeiden Sie das Verbergen von Methoden (new). Verwenden Sie override für echte Polymorphie. Beim Verbergen wird über eine Basisklassenreferenz die Version der Basisklasse aufgerufen.
using System;
public class Printer
{
public virtual void Print() { Console.WriteLine("[Base]"); }
}
public class LoudPrinter : Printer
{
public override void Print() { Console.WriteLine("[LOUD]"); }
}
public class HiddenPrinter : Printer
{
// Hides the base method instead of overriding (BAD fit for polymorphism)
public new void Print() { Console.WriteLine("[HIDDEN]"); }
}
public class Program
{
public static void Main(string[] args)
{
Printer a = new LoudPrinter();
Printer b = new HiddenPrinter();
a.Print(); // [LOUD] (override works)
b.Print(); // [Base] (hiding fails via base reference)
}
}
Sichere Typumwandlung (as + Prüfung)
Bevorzugen Sie Aufrufe über die Basis- oder virtuelle Methoden. Wenn Sie Member verwenden müssen, die nur in der abgeleiteten Klasse vorhanden sind, wandeln Sie den Typ sicher um (as + Nullprüfung).
using System;
public class Vehicle
{
public virtual string Info() { return "Vehicle"; }
}
public class Car : Vehicle
{
public bool HasAirConditioning;
public override string Info() { return "Car"; }
}
public class Program
{
public static void Main(string[] args)
{
Vehicle v = new Car();
Console.WriteLine(v.Info()); // polymorphic call
// Need a Car-only member? Cast carefully using 'as'
Car c = v as Car;
if (c != null)
{
c.HasAirConditioning = true;
Console.WriteLine("AC set: " + c.HasAirConditioning);
}
else
{
Console.WriteLine("Not a Car");
}
}
}
Tipps zur Polymorphie
Tipps:
- Entwerfen Sie zuerst für Aufrufe über Basis- oder virtuelle Methoden.
- Verwenden Sie override, nicht new, um Verhalten zu ändern.
- Halten Sie APIs der Basisklasse klein und stabil.
- Wandeln Sie Typen selten um. Bevorzugen Sie Polymorphie oder Schnittstellen.
Bedeutung des dynamischen Dispatch
Zusammenfassung
Zusammenfassung: Polymorphie ermöglicht es, dass ein Aufruf über die Basisklasse mithilfe von virtual/override viele Verhaltensweisen abgeleiteter Klassen erreicht. Verwenden Sie Sammlungen mit Basistyp, vermeiden Sie das Verbergen mit new und wandeln Sie Typen nur bei Bedarf um.
Lerne C# mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 93
- Lektionen
- 346
Häufig gestellte Fragen
Ist die Lektion „Polymorphismus und dynamischer Dispatch“ kostenlos?
Ja — der vollständige Text von „Polymorphismus und dynamischer Dispatch“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.
Was lerne ich in „Polymorphismus und dynamischer Dispatch“?
Verstehen Sie Polymorphismus: Rufen Sie virtuelle Member über eine Basisklassenreferenz auf, verwenden Sie Collections mit Basistypen, vermeiden Sie das Verbergen von Methoden und führen Sie bei Beda… Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 3.
Wie lange dauert die Lektion „Polymorphismus und dynamischer Dispatch“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- virtual/override/sealed und abstrakte Klassen
- Interfaces (Einführung) und Implementierung mehrerer Interfaces
- Polymorphismus und dynamischer Dispatch