Как дифференцировать типы дротиков

У меня есть следующие типы:

class AddressEditor extends TextEditor {}
class TypeEditor extends TextEditor {}

Я попытался идентифицировать редакторов как таковых:

void validationErrorHandler( ValidationError e )
{
  var editor = e.editor;
  if( editor is AddressEditor )
   print( editor.runtimeType.toString() ) // prints TextEditor

  if( editor is TypeEditor )
   print( editor.runtimeType.toString() ) // prints TextEditor
}

Если я использую зеркала

import 'dart:mirrors'; 

getTypeName(dynamic obj) 
{
  return reflect(obj).type.reflectedType.toString();
}

void validationErrorHandler( ValidationError e )
{
  var editor = e.editor;
  if( editor is AddressEditor )
   print( getTypeName( editor ) ) // prints TextEditor

  if( editor is TypeEditor )
   print( getTypeName( editor ) ) // prints TextEditor
}

Почему тип редактора TypeEditor а также AddressEditor не быть идентифицированным? Да я знаю что либо TextEditor, но есть ли способ определить TypeEditor или AddressEditor в дартс.

Мне нужно сделать эти идентификационные данные для работы с результатом проверки.

Спасибо

1 ответ

Решение

ОБНОВИТЬ

Оказывается, что TextEditor есть метод newInstance() который вызывается для получения новых экземпляров редактора BWU Datagrid (в принципе TextEditor это фабрика и реализация в одном).

Так как TypeEditor а также AddressEditor не переопределяйте этот метод, внутренне чистый TextEditor экземпляры созданы.

Чтобы получить желаемое поведение, вам нужно переопределить newInstance и реализовать конструктор, используемый этим методом. Потому что конструктор в TextEditor является частным, его нельзя использовать повторно, и его необходимо скопировать (я пересмотрю этот дизайн). Первые две строки скопированного конструктора нужно немного адаптировать.

AddressEditor будет выглядеть так

class AddressEditor extends TextEditor {
  AddressEditor() : super();

  @override
  TextEditor newInstance(EditorArgs args) {
    return new AddressEditor._(args);
  }

  AddressEditor._(EditorArgs args) {
    this.args = args;
    $input = new TextInputElement()
      ..classes.add('editor-text');
    args.container.append($input);
    $input
      ..onKeyDown.listen((KeyboardEvent e) {
      if (e.keyCode == KeyCode.LEFT || e.keyCode == KeyCode.RIGHT) {
        e.stopImmediatePropagation();
      }
    })
      ..focus()
      ..select();
  }
}

TypeEditor это то же самое, просто другое имя класса и конструктора.

ОРИГИНАЛ

Я уверен, что приведенный выше пример с is работает нормально, и что проблема кроется где-то еще (что эти значения не AddressEditors или же TypeEditors но просто TextEditors,

class TextEditor {}

class AddressEditor extends TextEditor {}
class TypeEditor extends TextEditor {}

void main() {
  check(new AddressEditor());
  check(new TypeEditor());
  check(new TextEditor());
}

void check(TextEditor editor) {
  if(editor is AddressEditor) print('AddressEditor: ${editor.runtimeType}');
  if(editor is TypeEditor) print('TypeEditor: ${editor.runtimeType}');
  if(editor is TextEditor) print('TextEditor: ${editor.runtimeType}');
}

выход

AddressEditor: AddressEditor
TextEditor: AddressEditor

TypeEditor: TypeEditor
TextEditor: TypeEditor

TextEditor: TextEditor
Другие вопросы по тегам