Polymorphie
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Veränderung (letzte Änderung) (keine anderen Diffs, Normalansicht)

Verändert: 26c26
Siehe auch: StatischOderDynamischTypisiert
Siehe auch: TypSicherheit, AgileTypDeklarationen

Polymorphie, aus dem Griechischen für Vielgestaltigkeit.

Allgemeines

ObjektOrientierteProgrammierung meint damit, daß verschiedene Objekte mit demselben Interface sich unterschiedlich verhalten können, wenn sie verschiedenen Klassen angehören.

Beispiel

Standardbeispiel: Sei Shape eine Basisklasse (oder ein Interface) und habe die Methode draw. Wenn Circle und Rectangle beide von Shape abgeleitet sind, müssen sie sinnvollerweise die draw-Methode von Shape überschreiben (oder implementieren). Eine Clientklasse kann nun auf dem Interface Shape operieren, und auf jedem Shape-Objekt draw aufrufen - der Polymorphiemechanismus bewirkt nun, dass immer die Methode des eigentlichen Objekts aufgerufen wird.

Statische Polymorphie

Wird die Polymorphie beim Kompilieren aufgelöst, so spricht man von statischer Polymorphie. Ein Beispiel dafür sind die Templates der SpracheCpp: Implementiert der angegebene Typ nicht alle benötigten Interfaces, so läßt sich das Template nicht instantiieren; die Kompilierung schlägt fehl. Sind alle Vorbedingungen erfüllt, so können jedoch zum Beispiel noch Inlinemethoden vom Kompiler expandiert werden bitte!.

Dynamische Polymorphie

Wird die Polymorphie jedoch erst zur Runtime aufgelöst, so nennt man das dynamische Polymorphie oder LateBinding?. In der SpracheCpp wird dynamische Polymorphie mit virtuelle Funktionen implementiert. Ruft man eine VirtuelleFunktion? auf, wird über eine versteckte Tabelle der tatsächliche Typ der Instanz ermittelt und die entsprechende Funktion aufgerufen. Daher können virtuelle Funktionsaufrufe im Allgemeinen nicht ge-inlined werden. Auf der anderen Seite kann über die späte Bindung jedoch das dynamische Nachladen von Code oder RPC-Mechanismen transparent realisiert werden, da erst bei Funktionsaufruf der tatsächliche Maschinencode benötigt wird.

Anderes

Da der Begriff nicht wirklich starr definiert ist, gibt es auch untergeordnete Bedeutungen, wie die Fähigkeit eines Objektes mehrere Typen zu haben. Diese werden aber nur sehr selten in der Praxis eingesetzt.


Siehe auch: TypSicherheit, AgileTypDeklarationen


DeleteMe?: Nachstehend noch Frage/Antwort von GregorRayman und IljaPreuß, die obigen Aufsatz ausgelöst hat, kann entsorgt werden, wenn Gregor die Antwort gesehen hat. -- 2003-01-29

Ich habe bisher Polymorphismus anders verstanden. Ich verstehe unter Polymorphismus, dass ein Objekt gleichzeitig mehrere Typen haben kann. So kann ein Objekt gleichzeitig z.B. Rectangle (und so Shape mit der Methode draw) und Persistent (mit z.B. der Methode Save) sein. Oder ein Mensch kann gleichzeitig ein Kind und ein Kunde sein, bzw. eine Organisation gleichzeitig ein Kunde und ein Addresat sein. gR

Im Allgemeinen ist es aber wirklich anders herum gemeint. Allerdings ist der Begriff nicht wirklich starr definiert - es gibt auch die Unterscheidung zwischen dynamischem und statischem Polymorphismus (wobei ich viele Leute kenne, die letzteres nicht als "echten" Polymorphismus bezeichnen würden). Im Zusammenhang mit OOP ist aber wirklich meistens gemeint, dass die Ausprägung eines Methodenaufrufes vom Typ des entsprechenden Objektes abhängt. -- IljaPreuß

Meine Bemerkung war zu schnell und zu ungenau formuliert, und sie war leider falsch. Nun bin ich aber trotzdem nicht mit dem Inhalt dieser Seite sehr zufrieden - sie erklärt den Unterschied zwischen Polymorphismus und Vererbung nicht gut genug. Ich bin aber mit der Kernaussage einverstanden: Polymorhismus ist, wenn man gleiche Methoden auf unterschiedliche Objekte anwenden kann. Also wenn unterschiedliche Objekte den gleichen Typ haben können. So kann, wie oben beschrieben, ein Quadrat und ein Kreis gleichzeitig vom Typ Shape sein (d. h. sie "implementieren die Schnittstelle Shape") Dabei ist nicht wichtig, ob sie von einer gemeinsamen Klasse abgeleitet sind (in SpracheJavaScript? gibt es z.B. keine Klassen) oder ob sie die Typzugehörigkeit irgendwie deklarieren (das kann man in SprachePython nicht). (Am Wochenende kann ich versuchen diese Seite bisschen zu refaktorisieren :-)

Bitte! :)


KategorieDefinition KategorieOop KategorieProgrammierSprachenKonzepte
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 20. Januar 2005 12:11 (diff))
Suchbegriff: gesucht wird
im Titel
im Text