在Haxe(JS目标)中,有没有一种方法可以使静态成员对另一个类可用,就好像它是自己的一样



我有一个Haxe类,它正在增长得相当大。它主要由静态方法和属性组成。(这是一个设置为编译为 JS 目标的模块)。

我想将一些复杂的静态函数分离到另一个类中。

有没有办法用元标记标记它/指示另一个类是原始类的"扩展"?

类似@:native("OriginalClass") class OtherClass {...}

目标是避免必须编写完整的变量访问(例如:OriginalClass.LOG_QUEUE vs. LOG_QUEUE )或将导入与 OtherClass 顶部使用的每个 OriginalClass 的静态方法/属性混杂在一起。基本上,让它知道它"正在使用"与 OriginalClass 相同的成员(每当在编译时找到"未定义"的成员时)。

例:

如果 OriginalClass 有static var LOG_QUEUE:Array<String>;那么 OtherClass 就会意识到,LOG_QUEUE编译到这个 JS 代码的任何用法都会OriginalClass.LOG_QUEUE

好的,在与 Slack 上的 Haxe 专家组的 Dima Granetchi 讨论后得到了解决方案。

现在,虽然这仍然会生成使用 OriginalClass 的静态成员的OtherClass,但您可以使用通配符*符号来减少大多数(如果不是全部)模块/类的静态成员的 import 语句数量,如以下示例所示:

// OriginalClass.hx
package somePackage;
class OriginalClass {
    public static var LOG_QUEUE:Array<String>;
    public static function main() {
        LOG_QUEUE = [];
        OtherClass.doSomething();
    }
    public static function doSomethingOriginal() {
        LOG_QUEUE.push("World!");
    }
}

// OtherClass.hx
import somePackage.OriginalClass.*; // <-- Demonstrating the WILDCARD (*) symbol
class OtherClass {
    public static function doSomething() {
        LOG_QUEUE.push("Hello"); //Resolved to OriginalClass.LOG_QUEUE
        doSomethingOriginal(); //Resolved to OriginalClass.doSomethingOriginal()
    }
}

尽管这是一个最小示例,但当您在OtherClass中使用了几个不同的静态成员时,它会变得更加有用。

注意

OtherClass中使用的OriginalClass中定义的 TypeDefs 似乎没有得到识别/解析(可能是由于缺少公共访问器,但我无法在我的 typedefs 上设置它)。您始终可以使用单独的导入语句导入这些特定的 TypeDef,如下所示:

//Somewhere at the top of OtherClass.hx...
import somePackage.OriginalClass.MyTypeDef;

相关内容

最新更新