Klassen
A10.cs
using System;
class OverflowException: Exception {}
class UnderflowException: Exception {}
// generic queue
class Queue {
object[] values = new object[10];
int head = 0, tail = 0;
public void Enqueue(object x) {
int tail1 = (tail + 1) % 10;
if (tail1 == head) throw new OverflowException();
values[tail] = x;
tail = tail1;
}
public object Dequeue() {
if (head == tail) throw new UnderflowException();
object x = values[head];
head = (head + 1) % 10;
return x;
}
public int Length() {
return (tail + 10 - head) % 10;
}
}
// program that uses a queue to store integers and strings
class Test {
public static void Main() {
Queue q = new Queue();
q.Enqueue(1); q.Enqueue(2); q.Enqueue(3);
while (q.Length() > 0) {
Console.Write((int)q.Dequeue() + " ");
}
Console.WriteLine();
q.Enqueue("Alice"); q.Enqueue("Bob"); q.Enqueue("Charly");
while (q.Length() > 0) {
Console.Write((string)q.Dequeue() + " ");
}
Console.WriteLine();
}
}
|
Der Unterschied zwischen dieser "pseudogenerischen" Queue und einer
echten generischen Queue liegt darin, dass in dieser Implementierung
auch Werte unterschiedlicher Typen gespeichert werden können.
Der Compiler kann keine Queue mit homogenen Werten erzwingen.
Wird ein Objekt eines Werttyps übergeben, findet Boxing statt.
Beim Entnehmen eines Werts muss man ihn mit einer Typumwandlung
wieder in seinen ursprünglichen Typ konvertieren.
Sowohl Boxing als auch die Typumwandlung kosten Laufzeit.
|