2014-02-18 1 views
2

, если у меня есть:dart, учитывая экземпляр класса, можно ли получить список всех типов, на которые он наследует, в порядке возрастания?

List<Type> getInheritanceStructure(){ 
    // TODO 
} 

class A{ 
} 
class B extends A{ 
} 
class C extends B{ 
} 

var c = new C(); 

List<Type> types = getInheritanceStructure(c); 

types.forEach((type) => print(type)); 

//should print out: 
C 
B 
A 
Object 

можно ли получить список типов, как это?

+1

Мой ответ на этот вопрос http://stackoverflow.com/questions/20743346 делает что-то подобное. Он ищет все базовые классы, если находит статический метод данного имени. Это должно заставить вас начать. –

+0

http://stackoverflow.com/questions/16150437 –

ответ

1

Вам нужно зеркало класса, оттуда вы можете пройти через все суперклассы.

List<Type> getInheritanceStructure(Object o){ 
    ClassMirror baseClass = reflectClass(o.runtimeType); 
    return walkSuperclasses(baseClass); 
} 

List<Type> walkSuperclasses(ClassMirror cm) { 
    List<Type> l = []; 
    l.add(cm.reflectedType); 
    if(cm.superclass != null) { 
     l.addAll(walkSuperclasses(cm.superclass)); 
    } 
    return l; 
} 
+0

спасибо, есть ли разница между использованием 'reflectClass (o.runtimeType)' и 'reflect (o) .type'? – 0xor1

+0

Не в этом примере, но видимо есть разница. Из Dartdocs для 'InstanceMirror.type':« Класс отражателя может отличаться от объекта, возвращаемого при вызове [runtimeType] на отражателя ». Я понятия не имею, при каких обстоятельствах это имеет какой-то эффект, извините. – MarioP

+0

yeh вот что я прочитал и задал свой вопрос, спасибо за информацию в любом случае. – 0xor1