如何区分Dart类型

时间:2014-09-04 20:07:59

标签: dart dart-polymer bwu-datagrid

我有以下类型:

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
}

为什么编辑器类型TypeEditorAddressEditor未被识别?是的,我知道这两个都是TextEditor,但有没有办法识别Dart中的TypeEditorAddressEditor

我需要使这些识别符合验证结果。

由于

1 个答案:

答案 0 :(得分:4)

更新

事实证明,TextEditor有一个方法newInstance()BWU Datagrid调用以获取新的编辑器实例(基本上TextEditor是工厂,实现在一个)

由于TypeEditorAddressEditor不会覆盖此方法,因此会创建内部纯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只是一个不同的类和构造函数名称。

<强> ORIGINAL

我非常确定上面的is示例工作正常并且问题出在其他地方(这些值不是AddressEditorsTypeEditors而只是{{} 1}}。

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}');
}