Legt man fest, daß man eine generische Einheit mittels privaten oder limitiert privaten generischen formalen Parameter realisieren will, so ergibt sich das Problem, daß die für diese Typen vordefinierten Operation im allgemeinen nicht ausreichen, um die Implementierung der generischen Einheit durchführen zu können. Man möchte sich vielmehr auf speziell für diesen (limitiert) privaten Typ deklarierte Operationen berufen können. Mit generischen formalen Unterprogrammen kann man festlegen, wie diese Operationen aussehen sollen. Bei der Instantiierung einer generischen Einheit muß dann sichergestellt sein, daß für den aktuellen generischen Parameter diese Operationen tatsächlich vorhanden sind.
Solche generische formale Unterprogramme werden mit dem Schlüsselwort with definiert, z.B.:
with function Summe (a,b: Element) return Element;
with function IMAGE (x: Aufzaehlung) return string is Aufzaehlung'IMAGE;
generic
*
``eindeutig definiert und sichtbar sein, so kann der aktuelle Wert
für die generische Funktion ,,*
``beim Instantiieren weggelassen werden, z.B. wären die folgenden
Instantiierungen gleichwertig:
function Quadriere is new Quadrat(Element ="
"
="
"
);
function Quadriere is new Quadrat(integer , "
"
);
function Quadriere is new Quadrat(integer);