22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

deferred class LIST[X]<br />

feature<br />

length: INTEGER;<br />

empty: BOOLEAN is -- Ist die Liste leer ?<br />

do Result := length=0 end;<br />

new is -- Erzeuge leere Liste<br />

deferred<br />

ensure<br />

empty<br />

end; -- new<br />

cons(r:X) is -- Hänge r vor die Liste<br />

deferred<br />

ensure<br />

not empty; head = r<br />

-- tail würde jetzt old liefern<br />

end; -- cons<br />

head: X is -- Erstes Element<br />

require<br />

not empty<br />

deferred end; -- head<br />

tail is -- Entferne erstes Element<br />

deferred<br />

ensure<br />

old empty implies empty<br />

end -- tail<br />

invariant<br />

nonnegative size: size >= 0<br />

end -- class LIST[X]<br />

Abbildung 3.35: Aufgeschobene Klasse<br />

Wir wollen aufgeschobene Klassen am Beispiel <strong>der</strong> generischen Klasse aller Listen illustrieren 30 , die wir bereits<br />

in Abbildung 3.4 als abstrakten Datentyp beschrieben und in Abbildung 3.26 als generische Klasse LIST<br />

skizziert hatten. Diese Klasse stellt Namen von Grundoperationen zur Verfügung, welche eine Art Mindestkollektion<br />

von Operationen auf Listen beschreiben.<br />

Eine aufgeschobene Klasse muß mit den Schlüsselworten deferred class beginnen, um klarzustellen, daß die<br />

Klasse nicht vollständig implementiert ist, da sie mindestens eine aufgeschobene Routine enthält. Dabei ist<br />

es durchaus erlaubt, daß einige Routinen einen vollständigen Anweisungsteil enthalten. Wir haben hierzu in<br />

Abbildung 3.35 die Klasse LIST um das feature length erweitert, welches eine einfache (und in allen Erben<br />

gültige) Implementierung <strong>der</strong> Funktion empty ermöglicht, die nicht aufgeschoben ist. An<strong>der</strong>e Routinen sind<br />

aufgeschoben, was man daran erkennt, daß anstelle des sonst üblichen mit do beginnenden Anweisungsteils<br />

das Schlüsselwort deferred steht. Alle an<strong>der</strong>en Bestandteile einer Routine – Kopf, Vor- und Nachbedingungen<br />

– bleiben erhalten .<br />

Man beachte, daß die aufgeschobene Klasse keine creation-Klausel hat, auch wenn die Routine new, die eigentlich<br />

dafür vorgesehen ist, deklariert wird. Die Begründung hierfür ist einfach: da Dienstleistungen einer<br />

aufgeschobenen Klasse eventuell nicht ausführbar sind, macht es wenig Sinn, Exemplare dieser Klasse zu<br />

erzeugen.<br />

30 An dieser Stelle sei darauf hingewiesen, daß die in diesem Skript benutzte Klasse LIST dem Listenkonzept entspricht,<br />

das in <strong>der</strong> Mathematik und in funktionalen Programmiersprachen benutzt wird, aber nicht <strong>der</strong> gleichnamigen Klasse <strong>der</strong> Eiffel-<br />

Basisbibliothek (das habe ich lei<strong>der</strong> erst entdeckt, nachdem die Hälfte des Skripts bereits geschrieben war). Die Eiffel-Klasse STACK<br />

kommt in ihrem Verwendungszweck den im Skript benutzten Listen am nächsten, verwendet jedoch an<strong>der</strong>e Routinennamen.<br />

Für die Erklärung <strong>der</strong> Konzepte spielt dieser Unterschied keine Rolle, denn man hätte in <strong>der</strong> Eiffel-Basisbibliothek durchaus<br />

die hier verwandten Bezeichnungen benutzen können. Bitte berücksichtigen Sie jedoch bei Implementierungsarbeiten, daß <strong>der</strong><br />

Compiler die Routinen new, head, tail, und cons in <strong>der</strong> Eiffel-Klasse LIST nicht finden wird.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!