Zum Hauptinhalt springen

Polymorphismus

Polymorphie ist ein wichtiger Konzept in der objektorientierten Programmierung (OOP) und bezieht sich auf die Fähigkeit eines Objekts, sich in verschiedenen Formen zu verhalten oder in unterschiedlichen Kontexten verwendet zu werden. Polymorphie ermöglicht es, dass verschiedene Klassen, die von einer gemeinsamen Basisklasse abgeleitet sind, Methoden unterschiedlich implementieren und dennoch über eine gemeinsame Schnittstelle aufgerufen werden können.

Es gibt zwei Haupttypen der Polymorphie in der OOP:

  1. Compilezeit-Polymorphie (statische Polymorphie): Dies wird auch als statische Bindung oder Überladen von Methoden bezeichnet. Bei der Compilezeit-Polymorphie wird die Methode, die zur Laufzeit aufgerufen wird, basierend auf dem Typ der Parameter oder Argumente zur Kompilierungszeit ermittelt. Dies geschieht insbesondere bei Methodenüberladung (Overloading).

    Beispiel für Compilezeit-Polymorphie:

    class Berechnungen
    {
    public int Add(int a, int b)
    {
    return a + b;
    }

    public double Add(double a, double b)
    {
    return a + b;
    }
    }
  2. Laufzeit-Polymorphie (dynamische Polymorphie): Dies wird auch als dynamische Bindung oder Überschreiben von Methoden bezeichnet. Bei der Laufzeit-Polymorphie wird die Methode, die zur Laufzeit aufgerufen wird, basierend auf dem tatsächlichen Typ des Objekts ermittelt. Dies geschieht bei der Vererbung und beim Überschreiben von Methoden (Methodenüberladung).

    Beispiel für Laufzeit-Polymorphie:

    class Tier
    {
    public virtual void GeraeuschMachen()
    {
    Console.WriteLine("Tier macht ein Geräusch.");
    }
    }

    class Hund : Tier
    {
    public override void GeraeuschMachen()
    {
    Console.WriteLine("Der Hund bellt.");
    }
    }

    In diesem Beispiel überschreibt die abgeleitete Klasse Hund die Methode GeraeuschMachen der Basisklasse Tier. Wenn Sie dann ein Hund-Objekt erstellen und die Methode aufrufen, wird die Überschreibung in der abgeleiteten Klasse verwendet.

Die Verwendung von Polymorphie ermöglicht es, flexiblen und wartbaren Code zu schreiben, da Sie sich auf die Schnittstelle (z. B. eine gemeinsame Basisklasse oder ein Interface) konzentrieren können, ohne sich um die spezifischen Implementierungen in abgeleiteten Klassen kümmern zu müssen. Dies fördert auch die Wiederverwendung von Code und ermöglicht es, Funktionen in verschiedenen Kontexten zu verwenden. Polymorphie ist ein grundlegendes Konzept in der OOP und ein Schlüsselmerkmal von Sprachen wie C#.

Kompilierzeittyp und Laufzeittyp

In der objektorientierten Programmierung (OOP) wird zwischen zwei wichtigen Typen unterschieden: dem Kompilierzeittyp (Compile-time Type) und dem Laufzeittyp (Runtime Type). Diese beiden Begriffe sind eng miteinander verbunden und spielen eine entscheidende Rolle bei der Verwendung von Polymorphie und späten Bindungen in OOP-Sprachen wie C#.

  1. Kompilierzeittyp (Compile-time Type):

    Der Kompilierzeittyp eines Ausdrucks oder einer Variablen wird bereits zur Kompilierzeit, also während des Übersetzungsprozesses des Codes, bestimmt. Er ist der statische Typ, der in der Deklaration oder Zuweisung einer Variablen angegeben wird. Dieser Typ gibt an, welche Mitglieder (Methoden, Felder, Eigenschaften usw.) zur Verfügung stehen und bei der Kompilierung aufgerufen oder überprüft werden können.

    Beispiel:

    Shape shape = new Circle(); // Kompilierzeittyp: Shape

    In diesem Beispiel ist der Kompilierzeittyp von shape die Basisklasse Shape, obwohl zur Laufzeit tatsächlich eine abgeleitete Klasse Circle verwendet wird.

  2. Laufzeittyp (Runtime Type):

    Der Laufzeittyp eines Objekts wird zur Laufzeit, also während der Ausführung des Programms, ermittelt. Er ist der tatsächliche dynamische Typ des Objekts, das zu einem bestimmten Zeitpunkt referenziert wird. Der Laufzeittyp bestimmt, welche Methode bei der Ausführung eines Methodenaufrufs tatsächlich aufgerufen wird. Dies ist insbesondere relevant, wenn Polymorphie und Methodenüberschreibungen verwendet werden.

    Beispiel:

    Shape shape = new Circle(); // Laufzeittyp: Circle

    Hier ist der Laufzeittyp von shape die abgeleitete Klasse Circle, da das tatsächliche Objekt, auf das shape verweist, eine Instanz von Circle ist.

Der Unterschied zwischen Kompilierzeittyp und Laufzeittyp ist entscheidend für die Funktion von Polymorphie und spätem Binden. Während der Kompilierzeittyp zur Kompilierzeit festgelegt wird und die Verwendungsüberprüfungen und Mitgliedszugriffe einschränkt, wird der Laufzeittyp zur Laufzeit ermittelt und bestimmt, welche Implementierung tatsächlich aufgerufen wird. Dies ermöglicht die flexible Verwendung von abgeleiteten Klassen in Verbindung mit Polymorphie.


Kommentare