C# Polymorphie: Statische vs. Dynamische Bindung
Was ist Polymorphie?
Polymorphie ("viele Formen") ermöglicht, dass ein Interface mehrere Implementierungen hat. In C# zwei Formen:
- Statische Polymorphie (Compile-Time) – Methode wird zur Kompilierzeit gebunden (Early Binding).
- Dynamische Polymorphie (Runtime) – Methode wird zur Laufzeit anhand des tatsächlichen Objekttyps aufgelöst (Late Binding).
Statische Polymorphie
1. Methodenüberladung (Overloading)
Mehrere Methoden mit gleichem Namen, aber unterschiedlicher Signatur (Anzahl/Typ der Parameter). Rückgabetyp allein reicht nicht.
public class PrintData
{
public void Print(int i) => Console.WriteLine($"Integer: {i}");
public void Print(double f) => Console.WriteLine($"Float: {f}");
public void Print(string s) => Console.WriteLine($"String: {s}");
}
// Nutzung
var p = new PrintData();
p.Print(5); // Integer: 5
p.Print(500.263); // Float: 500.263
p.Print("Hello"); // String: Hello
2. Operatorüberladung
Siehe nächstes Kapitel.
Dynamische Polymorphie
Abstrakte Klassen & Methoden
abstractKlasse: Kann nicht instanziiert werden; dient als Basisklasse.abstractMethode: Nur Deklaration, Implementierung in abgeleiteter Klasse erzwungen.- Abgeleitete Klasse muss alle abstrakten Member implementieren (oder selbst
abstractsein).
public abstract class Shape
{
public abstract int Area(); // keine Implementierung
}
public class Rectangle : Shape
{
private int Length, Width;
public Rectangle(int l, int w) { Length = l; Width = w; }
public override int Area() => Length * Width; // override Pflicht
}
// Nutzung
Shape shape = new Rectangle(10, 7);
Console.WriteLine($"Area: {shape.Area()}"); // 70
Virtuelle Methoden (virtual/override)
Basisklasse stellt Standardimplementierung bereit, abgeleitete Klasse kann überschreiben.
public class Shape
{
protected int Width, Height;
public Shape(int w = 0, int h = 0) { Width = w; Height = h; }
public virtual int Area() // Standardimplementierung
{
Console.WriteLine("Parent class area");
return 0;
}
}
public class Rectangle : Shape
{
public Rectangle(int w, int h) : base(w, h) { }
public override int Area()
{
Console.WriteLine("Rectangle class area");
return Width * Height;
}
}
public class Triangle : Shape
{
public Triangle(int w, int h) : base(w, h) { }
public override int Area()
{
Console.WriteLine("Triangle class area");
return Width * Height / 2;
}
}
// Polymorpher Aufruf
public class Caller
{
public void CallArea(Shape shape)
{
Console.WriteLine($"Area: {shape.Area()}");
}
}
// Nutzung
var caller = new Caller();
caller.CallArea(new Rectangle(10, 7)); // Rectangle class area → 70
caller.CallArea(new Triangle(10, 5)); // Triangle class area → 25
Zusammenfassung
| Art | Mechanismus | Bindung | Beispiel |
|---|---|---|---|
| Statisch | Overloading | Compile-Time | Mehrere Print(int), Print(string) |
| Statisch | Operator Overloading | Compile-Time | operator+ |
| Dynamisch | Abstract Methods | Runtime | abstract int Area() |
| Dynamisch | Virtual Methods | Runtime | virtual int Area() + override |
C Sprache
- C# Klassen & Objekte: Fundamente für robustes OOP
- C# Zugriffsmodifizierer verstehen: Public, Private, Protected, Internal und mehr
- C# Static Keyword: Statische Variablen, Methoden und Klassen meistern
- C# Abstrakte Klassen & Methoden meistern: Praktischer Leitfaden
- C# Geschachtelte Klassen verstehen: Definition, Verwendung und Vererbung
- C# Partielle Klassen und Methoden verstehen
- C++ Klassentemplates meistern: Ein praktischer Leitfaden
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java ObjectOutputStream meistern: Serialisierung, Methoden und praktische Beispiele
- Java Generics meistern – Wiederverwendbaren, typsicheren Code erstellen