2013-07-27 129 views

回答

2

由於onmystatic()是靜態的,它調用的任何函數都必須是靜態的(或某個對象的實例方法),所以我假設printCurrentType()也是靜態的。由於靜態方法不能被覆蓋,類型是恆定的,你可以這樣寫:

class User { 
    static onmystatic() { 
    printCurrentType(); 
    } 

    static printCurrentType() { 
    print(User); 
    } 
} 

如果你想printCurrentType()是印刷在包含類的任何靜態方法的類型,一些通用的方法,它被稱爲從,那麼...這是一個更艱鉅的任務。最簡單的答案就是不嘗試這樣做,並把類作爲參數:

class User { 
    static onmystatic() { 
    printCurrentType(User); 
    } 
} 

printCurrentType(Type type) { 
    print(type); 
} 

的複雜的答案是,你可以拋出一個異常,解析堆棧跟蹤,並嘗試通過一些規則,以確定你應該打印哪一堂課。我將把它作爲練習給讀者:)

+0

你一定是個好老師:) – Freewind

2

事實上,目前不可能不參考類本身做到這一點。

但總是存在一種非優雅的方式。這是直接問題的答案(不是間接的方式)。 如果你想使用此:

printCurrentType(); 

但你不希望使用此:

printCurrentType(User); 

然後在這個例子看看:

import 'package:stack_trace/stack_trace.dart'; 

void main() { 
    User.onmystatic(); 
    printCurrentType(); // should print: null 
} 

class User { 
static onmystatic() { 
    printCurrentType(); // should print: User 
    Teacher.onmystatic(); // should print: Teacher 
} 
} 

class Teacher { 
    static onmystatic() { 
    onmystatic2(); 
    } 

    static onmystatic2() { 
    printCurrentType(); 
    } 
} 

void printCurrentType() { 
    print(getClass(2)); 
} 

String getClass(int position) { 
    var trace = new Trace.current(); 
    var frames = trace.frames; 
    if(position >= frames.length) { 
    return null; 
    } 

    var member = frames[position].member; 
    var parts = member.split('.'); 
    if(parts.length < 2) { 
    return null; 
    } 

    return parts[0]; 
} 

它產生輸出:

User 
Teacher 
null 

而且也沒有魔法......

相關問題