2016-07-07 27 views
2

假设T1,T2和T3都具有我想统称的静态函数f1,f2,f3。如何将类型传递给函数并调用其静态方法?

怎么能这样轻松实现?

class T1 { 
    static f1(i) => i+1; 
    static f2(i) => i+1; 
    static f3(i) => i+1; 
} 

class T2 { 
    static f1(i) => i+2; 
    static f2(i) => i+2; 
    static f3(i) => i+2; 
} 

class T3 { 
    static f1(i) => i+3; 
    static f2(i) => i+3; 
    static f3(i) => i+3; 
} 

callGenerically(dynamic type) { 
    print(type); 

    type.f1(type.f2(type.f3)); 
} 

main() { 
    callGenerically(T1); 
    callGenerically(T2); 
    callGenerically(T3); 
} 

这打印T1,所以它得到的类型。只是不知道如何调用静态函数。即使预期f1,f2,f3存在,镜像是否成为选项或要求?

+0

我只想说这 - 总的来说 - 不是一个好的模式。如果你没有这样做(或者这不仅仅是一个语言实验),请尝试选择一种不同的方法,不要使用'dart:mirrors'。 – filiph

+0

为什么在你的场景中有3个'typedef's不起作用?你可以传递3个(函数)引用并组成你需要的方式。 –

回答

2

使用dart:mirrors来执行此操作:

现在

,如果你包裹在一个辅助方法“call”,然后callGenerically可以关注一下:

callGenerically(Type type, num arg) => 
    call(type, #f1, [call(type, #f2, [call(type, #f3, [arg])])]); 

你可以看到this DartPad一个完整的例子。

注意

  • 这是一个反模式,它是更好的沟通,飞镖的类型系统预计什么方法存在。如果你知道这些类具有相同的API,只需使用普通的多态而不是反射,就像乔纳斯的答案一样。
  • 使用dart:mirrors排除dart2js中的抖动,产生臃肿的JS。
  • f3的呼叫需要一个参数,因此callGenerically中的第二个参数。
1

我想这工作没有dart:mirrors,metaclasses将需要着陆。

in Dart, using Mirrors, how would you call a class's static method from an instance of the class?的代码应该让你开始 - 不知道,如果它仍然工程一样,这是很长一段时间我张贴的答案:d

+0

这很有帮助 - 但我不想构造一个不需要的实例,只需获取镜像即可调用静态函数。此外可能不能保证T有默认的ctor。我没有看到元类讨论,而且看起来像我将要做的事情。 – user1338952

+0

我很久没有使用dart:mirrors,也不记得细节。 –

+1

在'dart:mirrors'中,您需要'reflectType(T1)。调用(#f1,[])',如http://dartpad.dartlang.org/cd1bb844eaa48b210e53cd0b7b31a1e0 – Ganymede

2

这个构造采静态函数。也许还有其他人。

typedef int fadd_t(final int i); 

abstract class T { 
    final fadd_t f1; 
    final fadd_t f2; 
    final fadd_t f3; 

    T(final this.f1, final this.f2, final this.f3); 

    int fsum(final int i){ 
    return f1(f2(f3(i))); 
    } 
} 

class T1 extends T { 

    T1() : super(lf1, lf2, lf3){ 
    } 

    static lf1(i) => i+1; 
    static lf2(i) => i+1; 
    static lf3(i) => i+1; 
} 

class T2 extends T { 

    T2() : super(lf1, lf2, lf3){ 
    } 

    static lf1(i) => i+2; 
    static lf2(i) => i+2; 
    static lf3(i) => i+2; 
} 

callGenerically(final T t, final int i) { 
    return t.f1(t.f2(t.f3(i))); 
} 


main() { 

    T1 t1 = new T1(); 
    print('T1 fsum(1) : ' + t1.fsum(1).toString()); 
    print('T1 callGenerically(1) : ' + callGenerically(t1, 1).toString()); 

    T2 t2 = new T2(); 
    print('T2 fsum(1) : ' + t2.fsum(1).toString()); 
    print('T2 callGenerically(1) : ' + callGenerically(t2, 1).toString()); 
} 

T1 FSUM(1):4

T1 callGenerically(1):4

T2 FSUM(1):7

T2 callGenerically(1):7

相关问题