2015-11-03 24 views
1

在編程語言Haxe中,我有多個不同的'item'類,它們在提供一些參數時應該能夠給出一個值。這些函數應該與實際的對象實例沒有聯繫,但仍屬於這些類,因此它們應該是靜態的。但是,我希望能夠傳遞'Apple'或'Mango'類(而不是實例)並調用靜態方法。通常我會創建一個typedef,如果我想要訪問方法,但是當方法是靜態時我該怎麼辦? 如 -將靜態函數放在Haxe中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); 
     } 
    } 
} 

回答

4

類型定義做工精細,但你需要使用級符號到避免 「是方法,但應該是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()); 
    } 
} 

on try haxe

您可能還需要restrict DCE在某些情況下。

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