2013-07-27 6 views

답변

2

onmystatic()은 정적이므로 어떤 함수도 정적 (또는 일부 객체의 인스턴스 메소드)이어야하므로 printCurrentType()도 정적이라고 가정합니다. 정적 메소드를 오버라이드 (override) 할 수 없기 때문에, 형태는 일정하고 그냥 쓸 수 있습니다 :

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 

그리고 마법은 없다 ...

관련 문제