🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
一个接口是一个完全抽象的类型;它提供了骨架(实例字段声明)但是完全没有实现。因为它不提供任何程序,所以不能被实例化。因此,类只能实现接口但是不能扩展它们。一个类实现一个接口必须强制提供对每个接口中包含的字段的定义。 接口声明非常相似于类声明,使用相同的命名约定;如下: ~~~ //实现多接口使用逗号分隔 interface Name implements Interface, implements Other { //... } ~~~ 接口主体可以包括函数和变量的定义,因为它和在类定义时发生有一个明显区别:函数不能有一个如下所示的函数体。 ~~~ interface IPerson { var firstName : String; var familyName : String; function getFullName() : String; } ~~~ 接口名前大写的I字母似乎一个命名约定,在其他语言如C#中也见到过,但是它不是必须的,你可以遵循自己的约定,但是建议按照这个方式命名。 一个接口可以实现一个或者更多的接口,但是不能扩展它们。而在类的定义中情况相反,当访问修饰符是忽略,public 默认值总是被赋予;函数、参数、变量和属性的类型必须总是显式提供。 静态字段在接口中声明没有意义,因为,已经解释过,它们仅仅被声明类型拥有,不会被继承。 接口在实践中的应用于一个系统需要交换类型,它分享他们的定义,而不是实现。这样一个系统可以以图形用户界面(GUI)为例,需要一些部件(按钮,文本字段等)实现通用的Control接口。 另外典型的应用场景是在一个底层系统定义一个抽象层;在Haxe中,这个抽象类型可以在 neko.db.Connection 接口发现,它定义一个通用的和互换的方法来连接到数据库。所有的数据库,独立于它们的源,执行一些通用的任务:执行查询,连接到一个数据源,等等。这些通用任务以不同的方式实现,取决于供应商的选择。要统一不同库的行为,因此实现抽象的的层,需要写一些胶水代码。这个代码回包括封装源API的函数并映射哪些在neko.db.Connection实现类的功能。这种方式,可以以使用MySql和SQLite为例,以一种相同的方式,更重要的是一个可交换的方式。当需要从一个db切换到另一个,这足以改变实例化的线路。