6. Referenzieren von Objekten Inhaltsverzeichnis 8. Implementierung mit Reihung

7. Beispiel: Warteschlange

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.

6. Referenzieren von Objekten Inhaltsverzeichnis 8. Implementierung mit Reihung

[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