将静态函数放在Haxe typedef中

时间:2015-11-03 02:37:26

标签: haxe

在编程语言Haxe中,我有多个不同的“item”类,当提供一些参数时,它们应该能够给出一个值。这些函数应该与实际的对象实例没有联系,但仍然属于这些类,因此,它们应该是静态的。

但是,我希望能够传入'Apple'或'Mango'类(不是实例)并调用静态方法。通常我会创建一个typedef,如果我想能够访问方法,但是当方法是静态时我该怎么办? 例如 -

class food
+eat() 
+throw()

Apple extends food
+eat()
+(static) getFatLevels (p:Person)

Mango extends food
+eat()
+throw()
+(static) getFatLevels (p:Person)

...

function chooseBestFood () {
    for (food in Foods){
         if (food.getFatLevels(person) < lowest){
             return (food);
         }
     }
 }

2 个答案:

答案 0 :(得分:4)

Typedef工作正常,但你需要使用类符号来避免&#34;是方法,但应该是var&#34;错误:

typedef HasMagic = {
    function magic():Void;
}

class Foo {
    public static function magic()
    {
        return 314;
    }
}

class Bar {
    public static function magic()
    {
        return 42;
    }
}

class Test {
    static function main()
    {
        var items:Array<HasMagic> = [Foo, Bar];
        for (i in items)
            trace(i.magic());
    }
}

on try haxe

在某些情况下,您可能还需要restrict DCE

答案 1 :(得分:3)

我没有按照你在这里使用typedef的方式。但是,如果您知道您的子类将全部实现此静态方法,则可以以非类型安全的方式执行以下操作:

class Food
{
    static function main() {
        var myFoodClass:Class<Food> = Apple;
        var method = Reflect.field(myFoodClass, "getFatLevels");
        trace(Reflect.callMethod(myFoodClass, method, []));
    }
}

class Apple extends Food
{
    public static function getFatLevels():Int
    {
        return 5;
    }
}