2016-07-07 46 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

相關問題