07.10.2013 Aufrufe

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

c○ Prof. Dr. B. Bartning, HS <strong>Emden</strong>/<strong>Leer</strong> Rumpfskript ” Informatik I/II“ (WS/SS 2010/11) 129<br />

Punkt (11.43), wie in C ++ abstrakte Klassen erzeugt werden (d. h. Klassen, die nur für die<br />

Klassenhierarchie von Bedeutung sind, da sie selbst keine Objekte haben können).<br />

(11.41) Die Polymorphie (dt. ” Vielgestaltigkeit“) oder der Polymorphismus ist in der Informatik<br />

ein sehr schillernder Begriff. Es wird je nach Autor Unterschiedliches darunter verstanden.<br />

Allgemein bedeutet die Polymorphie, dass verschiedenen Aktionen die gleichen Namen gegeben<br />

werden können; die Bindung des Namens an die tatsächlich auszuführende Aktion<br />

hängt vom Zusammenhang (Kontext) ab.<br />

(11.42)<br />

Ein sehr einfacher Fall der Polymorphie in C ++ wäre schon die Überladungsmöglichkeit<br />

von Funktionsnamen: je nach Kontext (Signatur des Aufrufs) wird die tatsächliche Aktion<br />

ausgewählt.<br />

Häufiger wird unter Polymorphie die Möglichkeit verstanden, dass Methoden verschiedener<br />

Klassen denselben Namen für ihre – unterschiedlichen – Aktionen vergeben dürfen (diese<br />

Aktionen sollten aber aus Übersichtlichkeitsgründen ähnliche Bedeutung haben). Innerhalb<br />

einer Ableitungshierarchie besteht die Möglichkeit, Funktionen der Basisklasse zu redefinieren,<br />

beispielsweise wenn eine bestimmte Aktion für Objekte der abgeleiteten Klassen<br />

(zumindest teilweise) anders durchzuführen ist.<br />

Insbesondere ist dieses Mittel in Zusammenhang mit der späten Bindung (oder dynamischen<br />

Bindung) 〈late binding, dynamic binding〉 sehr ausdrucksstark: hierbei findet die<br />

Bindung des Namens an die tatsächlich durchzuführende Aktion erst zur Laufzeit statt. Bei<br />

einer frühen Bindung (oder statischen Bindung) 〈early binding, static binding〉 wird<br />

die Bindung bereits durch den Compiler oder Linker festgelegt.<br />

Bei getypten Sprachen (z. B. C ++) ist aus Gründen der Fehlerminimierung Polymorphie mit<br />

später Bindung nur innerhalb einer Klassen-Ableitungshierarchie erlaubt; andere Sprachen<br />

erlauben sie beliebig (z. B. Smalltalk).<br />

Bsp Die Aktion schreibe(Buchstabe) ist je nach Schreibmittel sehr verschieden: beim Bleistift Abrieb von<br />

Graphit, beim Kugelschreiber Abrollen einer Kugel mit Farbe, beim Filzstift Wirkung von Kapillarkräften<br />

auf farbige Flüssigkeit usf. Die Aktion bleistift.schreibe(’B’) kann schon frühzeitig an das Graphitabreiben<br />

gebunden werden, der Befehl schreibstift.schreibe(’B’) kann jedoch erst dann an eine<br />

spezielle Aktion gebunden werden, wenn entschieden ist – ggf. erst zur Laufzeit –, welcher Art der Schreibstift<br />

ist.<br />

(a) Bei getypten Sprachen steht der Speicherplatzbedarf für das Erzeugen eines (einzelnen) Objekts<br />

schon zur Kompilationszeit fest; bei der Erzeugung ist immer der richtige Konstuktor<br />

bekannt. Werden dann die Aktionen (Elementfunktionen) mit dem zugehörigen Objektnamen<br />

aufgerufen, kann schon der Compiler entscheiden, welche Aktion stattfindet ( ” frühe<br />

Bindung“).<br />

(b) In C ++ ist es erlaubt, einem Zeiger einer Basisklasse die Adresse eines Objekts einer abgeleiteten<br />

Klasse zuzuweisen – entsprechend auch bei einer Referenz.<br />

Fortsetzung Beispiel aus (11.35):<br />

Basis *zeigBasis;<br />

Ableitung abl;<br />

zeigBasis=&abl; // erlaubt<br />

Basis &refBasis=abl; // ebenfalls erlaubt<br />

Hierbei ist unbedingt zu unterscheiden:<br />

• der statische Typ des Zeigers bzw. der Referenz<br />

(angegebenes Beispiel: zeigBasis/refBasis sind Zeiger/Referenz auf Basis)<br />

• und der dynamische Typ<br />

(angegebenes Beispiel: zeigBasis/refBasis sind Zeiger/Referenz auf Ableitung);<br />

dieser dynamische Typ steht letzlich erst zur Laufzeit fest.<br />

In diesem Fall ist es wichtig, wann die Bindung an eine Aktion geschieht:<br />

Welche Aktion wird beim Aufruf<br />

zeigBasis->aktion() bzw. refBasis.aktion()<br />

durchgeführt: Basis::aktion() oder Ableitung::aktion()?

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!