[NAME]
ALL.dao.interface

[TITLE]
抽象接口

[DESCRIPTION]

抽象接口(Interface)是一种通过申明成员方法和操作符重载的方式 来抽象的定义一个对象支持的使
用方式。 一个对象要与一个接口兼容,它必须包含该接口所定义的所有方法和操作符。 接口是一种抽象
类型,因为它没法创建实例对象,而且它的所有成员方法 都是没有实现的抽象方法。

这里是个简单的可检查对象大小的借口: 
     
   1  interface HasSize
   2  {
   3      routine size()=>int
   4  }
     
我们可以定义一个以该接口为参数的函数,这样我们就可以对任意支持 size()方法的对象调用该方法检
查它的大小: 
     
   1  routine PrintSize( object: HasSize )
   2  {
   3      io.writeln( object.size() )
   4  }
     
这个函数可以stringlistmap等为参数: 
     
   1  PrintSize( 'hello world' )
   2  PrintSize( { 1, 2, 3 } );
     


接口也支持继承(包括多重继承): 
     
   1  interface Resizable : HasSize
   2  {
   3      routine resize( size :int )
   4  }
     
类似的: 
     
   1  routine Resize( object: Resizable, size: int )
   2  {
   3      io.writeln( 'old size:', object.size() )
   4      io.writeln( 'new size:', size )
   5      object.resize( size )
   6  }
   7  
   8  var ls = {}
   9  Resize( ls, 5 )
  10  io.writeln( ls )
     


接口也支持操作符重载。但是,内置的类型和操作符不能通过接口检查, 因为它们不以方法的形式实现。
因此接口最主要还是用于道类类型和封装的C/C++类型。

定义相同集合的成员方法的借口可互换, 
     
   1  interface HasSize2
   2  {
   3      routine size()=>int
   4  }
   5  routine PrintSize2( object: HasSize2 )
   6  {
   7      o :HasSize = object; # assign an object of "HasSize2" to a variable of "HasSize";
   8      io.writeln( object.size() )
   9  }
  10  PrintSize2( {} );