[NAME]
ALL.dao.class.decorator

[TITLE]
修饰器类

[DESCRIPTION]

修饰器类是一种特殊的类,它可用来修饰(修改)其他类。 这种修饰是通过把这种类当作组件类用在新类
里。 作为组件类,它们的成员数据和方法将被加入到被修饰的类型, 并且修饰器类的成员修饰器方法将
按一定的规则被自动地应用到 被修饰类的成员方法上。

为了自动地应用成员修饰器方法,该方法的定义须指定应用规则。 这种规则主要以前缀和后缀的形式存
在,可按以下方式表示: 
  *  Prefix~ : 前缀模式。
     该修饰器方法将被自动地应用到方法名带此前缀且类型跟此该修饰器方法  的目标函数类型匹配
     的方法上; 
  *  ~Suffix : 后缀模式。
     该修饰器方法将被自动地应用到方法名带此后缀且类型跟此该修饰器方法  的目标函数类型匹配
     的方法上; 
  *  Prefix~Suffix : 前后缀模式。
     该修饰器方法将被自动地应用到方法名带此前后缀且类型跟此该修饰器方法  的目标函数类型匹
     配的方法上; 
  *  ~ : 空模式。
     该修饰器方法将被自动地应用到任意方法类型跟此该修饰器方法  的目标函数类型匹配的方法上
     ; 


当一个主类使用了多个修饰器类时,最前面的修饰器类的修饰器方法将被最后应用。 而同一个修饰器类
的多个修饰器方法,最前面定义也将最后被应用。
     
   1  class @Header
   2  {
   3      static routine @Delimiter( meth(args) : routine ) for ~ { 
   4          io.writeln( '=======================' )
   5          return meth( args, ... )
   6      }   
   7      routine @Delimiter( meth(args) : routine ) for ~ { 
   8          io.writeln( '-----------------------' )
   9          return meth( args, ... )
  10      }   
  11  }
  12  class @Decorator
  13  {
  14      var value = 654321
  15  
  16      routine @Test( meth(args) : routine<self:@Decorator> ) for Test {
  17          io.writeln( 'Decorator::Test()', value )
  18          meth( args, ... );
  19      }   
  20      routine @Prefix( meth(args) : routine<self:@Decorator> ) for Prefix~ {
  21          io.writeln( 'Decorator::Prefix()' )
  22          meth( args, ... );
  23      }
  24      routine @Suffix( meth(args) : routine<self:@Decorator> ) for ~Suffix {
  25          io.writeln( 'Decorator::Suffix()' )
  26          meth( args, ... );
  27      }
  28      routine @Prefix_Suffix( meth(args) : routine<self:@Decorator> ) for Prefix~Suffix {
  29          io.writeln( 'Decorator::Prefix_Suffix()' )
  30          meth( args, ... );
  31      }
  32  }
  33  
  34  class MyMixin ( @Header, @Decorator )
  35  {
  36      routine Test(){
  37          io.writeln( 'MyMixin::Test()' )
  38      }
  39      routine PrefixTest(){
  40          io.writeln( 'MyMixin::PrefixTest()' )
  41      }
  42      routine TestSuffix(){
  43          io.writeln( 'MyMixin::TestSuffix()' )
  44      }
  45      routine PrefixTestSuffix(){
  46          io.writeln( 'MyMixin::PrefixTestSuffix()' )
  47      }
  48  }
  49  
  50  obj = MyMixin()
  51  obj.Test()
  52  obj.PrefixTest()
  53  obj.TestSuffix()
  54  obj.PrefixTestSuffix()