interface MethodInterface { routine Method( a = 0 ); } routine TestMethodInterface( inter : MethodInterface ) { inter.Method( 123 ) } class MethodClass { routine Method( a = 0 ){ io.writeln( a ) } } @[test()] TestMethodInterface( MethodClass() ) @[test()] @[test()] 123 @[test()] interface OperatorInterface { routine []( index : int ) => int; routine .name() => string; } routine TestOperatorInterface( inter : OperatorInterface ) { io.writeln( inter[123] ); io.writeln( inter.name ); } class OperatorClass { routine []( index : int ){ return index } routine .name(){ return "name" } } @[test()] TestOperatorInterface( OperatorClass() ) @[test()] @[test()] 123 name @[test()] interface IteratorInterface { routine for( iter: tuple ); routine []( iter: tuple )=>int; } routine TestIteratorInterface( inter : IteratorInterface ) { for( i in inter ) io.writeln( i ) } class IteratorClass { routine for( iter: tuple ){ iter[0] = true; iter[1] = 0; } routine []( iter: tuple ){ id = iter[1]; iter[0] = id + 1 < 5; iter[1] = id + 1; return id; } } @[test()] TestIteratorInterface( IteratorClass() ) @[test()] @[test()] 0 1 2 3 4 @[test()] interface JointInterface : MethodInterface, OperatorInterface, IteratorInterface { } routine TestJointInterface( inter : JointInterface ) { TestMethodInterface( inter ) TestOperatorInterface( inter ) TestIteratorInterface( inter ) } class JointClass ( MethodClass, OperatorClass, IteratorClass ) { } @[test()] TestJointInterface( JointClass() ) @[test()] @[test()] 123 123 name 0 1 2 3 4 @[test()]