Включение статических функций в определение типа Haxe

В языке программирования Haxe у меня есть несколько разных классов «элементов», которые должны иметь возможность давать значение при наличии некоторых аргументов. Эти функции не должны иметь контакта с фактическими экземплярами объектов, но по-прежнему принадлежать этому классу, поэтому они должны быть статическими.

Однако я хочу иметь возможность передавать класс 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);
         }
     }
 }

person 5Mixer    schedule 03.11.2015    source источник


Ответы (2)


Определения типов работают нормально, но вам нужно использовать нотацию класса, чтобы избежать ошибок типа "is method but should be var":

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());
    }
}

(попробуйте haxe)

В некоторых случаях вам также может потребоваться ограничить DCE.

person Jonas Malaco    schedule 03.11.2015

Я не понимаю, как здесь можно использовать 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;
    }
}
person heyitsbmo    schedule 03.11.2015