====== enhance ======
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.
enhance kann nun Person erweitern:
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 generisch ======
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 [[notes:op:iterable]]