将静态函数放入 Haxe typedef
Putting static functions in a Haxe typedef
在编程语言 Haxe 中,我有多个不同的 'item' classes 在提供一些参数时应该能够给出一个值。这些函数应该与实际的对象实例没有联系,但仍然属于这些class,因此,它们应该是静态的。
但是,我希望能够传入 'Apple' 或 'Mango' class(不是实例)并调用静态方法。通常,如果我希望能够访问方法,我会创建一个 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);
}
}
}
我不了解您在这里使用 typedef 的方式。但是,如果您知道您的 child 类 都将实现此静态方法,则可以按 non-type-safe 方式执行以下操作:
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;
}
}
Typedefs 工作正常,但您需要使用 class 符号 以避免 "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());
}
}
在某些情况下,您可能还需要 restrict DCE。
在编程语言 Haxe 中,我有多个不同的 'item' classes 在提供一些参数时应该能够给出一个值。这些函数应该与实际的对象实例没有联系,但仍然属于这些class,因此,它们应该是静态的。
但是,我希望能够传入 'Apple' 或 'Mango' class(不是实例)并调用静态方法。通常,如果我希望能够访问方法,我会创建一个 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);
}
}
}
我不了解您在这里使用 typedef 的方式。但是,如果您知道您的 child 类 都将实现此静态方法,则可以按 non-type-safe 方式执行以下操作:
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;
}
}
Typedefs 工作正常,但您需要使用 class 符号 以避免 "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());
}
}
在某些情况下,您可能还需要 restrict DCE。