Мне нужен способ проверить, является ли класс абстрактным. Может ли кто-нибудь мне помочь?Есть ли способ проверить, является ли класс абстрактным?
ответ
К сожалению, ответ прямо сейчас: вы не можете.
Как упоминал Джастин, для возможностей отражения есть Mirrors API. Однако, похоже, не существует флага для «абстрактного».
Если это функции, которые вы хотели бы видеть, вы можете подать запрос на функцию здесь: http://dartbug.com/new
Вы могли бы сделать что-то вроде
library x;
import 'dart:mirrors';
abstract class MyAbstract {
void doSomething();
}
class MyConcrete{
}
void main(List<String> args) {
print('MyAbstract: ${isAbstract(MyAbstract)}');
print('MyConcrete: ${isAbstract(MyConcrete)}');
}
bool isAbstract(Type t) {
ClassMirror cm = reflectClass(t);
if(cm.declarations.values.firstWhere(
(MethodMirror mm) => mm.isAbstract == true, orElse:() => null) != null) {
return true;
}
try {
InstanceMirror i = cm.newInstance(new Symbol(''), []);
} catch(e) {
return (e is AbstractClassInstantiationError);
}
return false;
}
newInstance
часть должна быть расширена, чтобы проверить, нет конструктора по умолчанию и попробуйте использовать конструкторы named.
AFAIR недавно был a discussion, если ему разрешено создавать экземпляр абстрактного класса (по отношению к инъекции зависимостей), если этот метод изменения выше не может работать больше, но я не могу найти что-то об этом в трекер-проблеме.
звезда Также этот запрос функции: Add a method to check if a class is abstract
Зеркала, вероятно, следует предложить эту информацию, но это не кажется. Все, что я могу придумать, это попытаться создать экземпляр класса и поймать исключение, но это означает, что вам нужно статически знать подпись конструктора. Что вы пытаетесь сделать? –
Я пытался перенести фрагмент кода Java, где была сделана проверка, если класс был абстрактным или нет, и на этой основе создал экземпляр этого метода с использованием отражения. Просмотрев код сейчас, я не вижу необходимости делать эту проверку. Я могу просто создать экземпляр и проверить, не возникла ли какая-либо ошибка. Спасибо. – Tiago