Was versteht man unter Polymorphie in der objektorientierten Programmierung?

...komplette Frage anzeigen

2 Antworten

Polymorphie in der OOP beschreibt den Umstand, dass ein Bezeichner einen anderen Datentyp annehmen kann. Mögliche Datentypen (neben dem eigenen) sind aber nur jene, welche in der Vererbungshierarchie darunter liegen, sich also wesentliche Eigenschaften mit dem Basistyp teilen.

Ein Beispiel:

using System;

public interface IPrintable { void Print(); }
public class Test { public static void Main() { IPrintable[] texts = { new Text(), new ColoredText() };
foreach(var text in texts) { text.Print(); }
}
}
public class Text : IPrintable
{ protected string text;
public virtual void Print() { Console.WriteLine(text); } }
public class ColoredText : Text { private ConsoleColor _color;
public override void Print() { Console.ForegroundColor = _color; Console.WriteLine(text); Console.ForegroundColor = ConsoleColor.White;
}
}

Das Interface IPrintable kann die 2 Datentypen in sich aufnehmen, die in der Vererbungshierarchie unter dem Interface liegen, sich also mit dem Interface Eigenschaften teilen. Genauso wäre aber auch folgendes möglich:

Text text = new ColoredText();

Weil ColoredText von Text ableitet, kann dieser Bezeichner auf das Objekt des Subtyps zeigen.

Zu beachten ist, dass der Bezeichner nun nur noch die Methoden kennt, die der Basistyp kennt. Wenn ColoredText also bspw. eine Methode ChangeColor implementieren würde, wäre diese über den Bezeichner text dennoch nicht aufrufbar. Dieser orientiert sich nämlich nach dem Bauplan von Text, nicht ColoredText. Um auf das wirkliche Objekt wieder zugreifen zu können, müsste man daher einen Typecast vornehmen:

((ColoredText)text).ChangeColor(ConsoleColor.Red);

Das konkrete Objekt, welches text zugewiesen wurde, wüsste immer noch über all seine Methoden und Zustände bescheid.

Zurück zu dem obigen Beispiel, soll diese weitere Eigenheit der Polymorphie (ein Objekt kennt seine eigenen Zustände und Methoden) noch im Bezug auf die späte Bindung erklärt werden, welche hier bei den Methodenaufrufen in der Schleife auftritt. Bei jedem Methodenaufruf wird die Vererbungskette bis zum konkreten Typ durchlaufen und die letzte Definition von Print verwendet. 

  • Beim 1. Durchlauf zeigt der Bezeichner auf die konkrete Instanz von Text und ruft von dieser Klasse die Methode Print auf.
  • Beim 2. Durchlauf zeigt der Bezeichner auf die konkrete Instanz von ColoredText und ruft von dieser Klasse die Methode Print auf. Würde ColoredText die Methode nicht überschreiben, würde die Definition aus dem Basistyp Text genutzt werden.

So viel zur Polymorphie, wie sie bei vielen Sprachen (C#, Java, ...) definiert ist. In einigen Sprachen (z.B. Objective-C) geht das polymorphe Verhalten sogar noch weiter, über die Klassengrenzen hinaus.

Antwort bewerten Vielen Dank für Deine Bewertung

Hallo.

Ich gehe hier mal auf ein Beispiel aus Java ein. Angenommen du hast ein Interface Drucker, welches von der Klasse Kombigerät implementiert wird. Das Interface Drucker gibt dabei vor, was das Kombigerät können muss, beispielsweise die Methode drucken muss von Kombigerät implementiert werden.

Nun kann ich jedoch ein Kombigerät instanzieren und auf einer Variable speichern, die den Datentyp Drucker hat. Somit betrachte ich das Kombigerät nur als Drucker und kann logischerweise auch nur auf die Methoden zugreifen, die vom Interface Drucker vorgegeben ist. Kombigerät könnte auch ein Interface Scanner implementieren, aber das juckt mich an der Stelle nicht, da ich nur drucken möchte. Wenn ich also die Methode drucken aufrufe, wird die Methode wie von der Klasse Kombigerät implementiert ausgeführt. Die Klasse Kombigerät hat vielleicht auch eine Methode scannen, aber auf die kann ich nicht zugreifen, da das Kombigerät nur als Drucker betrachtet wird. Dabei bezeichnet man Kombigerät als dynamischen und Drucker als statischen Typ.

Mit anderen Worten kannst du auf einer Variable, die den Datentyp eines Interfaces hat, ein Objekt jedweder Klasse ablegen, die dieses Interface implementiert. Ähnlich funktioniert es auch mit Vererbung.

Gruß

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?