51. 接口

interface 模块实现 [interface] 模式,该模式允许类公开多个接口。

所有函数和符号都在 “interfaces” 模块中,使用 require 来访问它。:

require daslib/interfaces

让我们回顾一下以下示例:

require daslib/interfaces

[interface]
class ITick
    def abstract beforeTick : bool
    def abstract tick ( dt:float ) : void
    def abstract afterTick : void

[interface]
class ILogger
    def abstract log ( message : string ) : void

[implements(ITick),implements(ILogger)]
class Foo
    def Foo
        pass
    def ITick`tick ( dt:float )
        print("tick {dt}\n")
    def ITick`beforeTick
        print("beforeTick\n")
        return true
    def ITick`afterTick
        print("afterTick\n")
    def ILogger`log ( message : string )
        print("log {message}\n")

在上面的示例中,我们定义了两个接口,ITick 和 ILogger。然后我们定义一个类 Foo,它实现了两个接口。类 Foo 必须实现两个接口的所有方法。类 Foo 可以实现其他方法,这些方法不是接口的一部分。

[implements] 属性用于指定类实现的接口。

[interface] 属性用于定义接口。此宏验证接口是否没有任何数据成员,只有方法。

通过模式匹配方法名称,接口方法会自动绑定到特定接口。例如,方法 “tick” 绑定到接口 ITick,因为方法名称以 “ITick’” 开头。方法 “log” 绑定到接口 ILogger,因为方法名称以 “ILogger’” 开头。

此外,还为 Foo 类生成 get’ITick 和 get’ILogger 方法。它们用于获取给定接口的接口对象。interface 对象用于调用接口方法。:

var f = new Foo()
f->get`ITick()->beforeTick()
f->get`ITick()->tick(1.0)
f->get`ITick()->afterTick()
f->get`ILogger()->log("hello")

51.1. 结构宏

interface

实现 ‘interface’ 宏,该宏验证 class 是否为接口(没有自己的变量)

implements

实现 ‘implements’ 宏,添加 get`{Interface} 方法以及接口绑定和实现。