Enhance erweitert die Funktionalität von Objekten, kann aber keine zusätzlichen Member einführen.
Person contains { Vorname, Nachname as String; construct( Vorname, Nachname ); }; // Klasse fertig. </code cpp> enhance kann nun Person erweitern: <code cpp> enhance Person { operator $ -> string : Vorname + " " + Nachname; SayHello is code := print "Hello, ", Vorname; };
Nun können Personen auch diese Funktionen aufrufen:
Person p( "Sascha", "Atrops" ); p.SayHello(); print p$;
enhance kann auch generisch verwendet werden und so eine unbestimmte Menge an Klassen erweitern, die gewisse Mindestanforderungen erfüllen.
Debugger is enhance( T( contains $ as string ) )
{
DebugOut is code :=
{
print "DebugOut for Type %s: %s\n" % (T$, this$ );
}
};
Hiermit wird jeder Klasse (genannt T), die über den Operator $ verfügt eine Methode 'Debugger::DebugOut' untergejubelt, die direkt im Namensraum liegt, also über p.DebugOut() angesprochen werden kann. Sollten mehrere enhancements vorliegen, so kann auch p.Debugger::DebugOut() verwendet werden.
Debugger is enhance( T is type contains $ as string, U is type contains $ as string
contains Vorname as string )
{
DebugOut is code( person is U ) :=
{
print "%s sendet DebugOut for Type %s: %s\n" % (person.Vorname, T$, this$ );
}
};
contains kann hier auch ein ganzes Interface benennen, z.B. um die generische Funktion „std::remove_if“ zu implementieren, die so allen Iterierbaren Containern zur Verfügung steht.
Debugger is enhance( T( contains interface Iteratable ) )
{
removeIf( filter is code( T const & ) -> bool )
{
for( x in this ) // for verlangt die Implementation der Operatoren Iterable
{
if( filter( x ) )
this.remove( x );
}
}
};
siehe iterable