====== 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]]