Task-Typen können auch eine Diskriminante besitzen. Typische Anwendungen sind zum Beispiel
Diskriminanten können aber auch verwendet werden, um Tasks eine Art von Identifikation zu geben. Betrachten wir folgendes Beispiel:
subtype Task_Range is 1 .. 1000;
function Next_One return Task_Range;
task type Computer(Index: Task_Range := Next_One);
The_Tasks: array (Task_Range) of Computer;
Ein anderes Beispiel, wie diskriminierte Tasks und Typerweiterung zusammenarbeiten können, sei wie folgt gegeben:
task type T(Job: access Job_Descriptor'CLASS);
task body T is
begin
Start(Job);
for I in 1 .. Iterations(Job) loop
delay Interval(Job);
Do_It(Job, I);
end loop;
Finish(Job);
exception
when Event: others =
Handle_Failure(Job, Event);
end T;
package Base_Job is
type Job_Descriptor is abstract tagged null record;
procedure Start(J: access Job_Descriptor);
function Iterations(J: access Job_Descriptor) return integer is abstract;
function Interval(J: access Job_Descriptor) return duration is abstract;
procedure Do_It(J: access Job_Descriptor; I: integer) is abstract;
procedure Finish(J: access Job_Descriptor);
procedure Handle_Failure(J: access Job_Descriptor; E: Exception_Occurence);
end Base_Job;
Eine sinnvolle Implementierung eines Jobs ist dem Leser überlassen.
Johann Blieberger