Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
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.