Als Beispiel betrachten wir die generische Schnittstelle Queue (in Anlehnung an die Schnittstelle java.util.Queue), die einen FIFO[1]-Behälter beschreibt:
/** @(#) Queue.scala - for translation: queue.bat * @version December 2, 2010 * @author Prof. Solymosi (c) 2010 * A FIFO collection * @param E type of the elements in the queue */ trait Queue[E] { // [2] /** Inserts the specified element into the queue, if possible. * @param o the element to insert. * @throws IllegalStateException if the queue is full. */ def add(o: E) /** Removes the head of this queue. * @throws NoSuchElementException if the queue is empty. */ def remove // [3] /** Retrieves the head of this queue. * @return the head of this queue. * @throws NoSuchElementException if the queue is empty. */ def element: E /** Makes queue empty. */ def clear /** Tells whether the queue is empty. * @return remove or element would throw NoSuchElementException. */ def isEmpty: Boolean /** Tells whether the queue is full. * @return add would throw IllegalStateException. */ def isFull: Boolean }
Mit dieser Schnittstelle kann ein Benutzerprogramm parametrisiert werden:
def benutzerprogramm(ws: Queue[Integer]): Integer = { // [4] ws.add(1) // [5] ws.add(2) ws.add(3) ws.remove return ws.element }
Diese (nicht allzu sinnvolle) Funktion kann natürlich nur dann aufgerufen werden, wenn die Schnittstelle implementiert wird und von der implementierenden Klasse ein (z.B. Queue[String]-) Objekt erzeugt wurde.
Die folgende generische Funktion füllt eine beliebige Warteschlange mit den übergebenen Daten vom passenden Typ:
def füllen[T](ws: Queue[T], daten: Array[T]) = { // [6] ws.clear for (t <- daten) ws.add(t) }
Das Objektdiagramm, das die Arbeitsweise dieser Funktion darstellt, ist einfach:
Abbildung 16: füllen aus Array
Array-Objekte können abgekürzt (wie oben) ohne das umfassende Oval gezeichnet werden. Der grüne gestrichelte Pfeil zeigt die Bewegungsrichtung innerhalb der Reihung an.
[1] First In, First Out, d.h. Warteschlange
[2] trait entspricht in vieler Hinsicht Java’s interface
[3] als Ergebnistyp wird für Prozeduren None (in Java void) als Standardwert angenommen
[4] In diesem Aufsatz benutzen wir englische Bezeichner und Kommentare für nach außen sichtbare (public) Programmteile und deutsche für unsichtbare (private).
[5] 1 wird implizit nach Integer konvertiert („wrapped“)
[6] dies ist eine (generische) Funktion mit Typparameter T
Version: 5. Dezember 2010
© Prof. Solymosi, 2010, Beuth-Hochschule für Technik Berlin