3

我有以下类型:

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被识别?是的,我知道其中之一是 a TextEditor,但是有什么方法可以识别 Dart 中的 theTypeEditor或 the AddressEditor

我需要使这些识别与验证结果一起工作。

谢谢

4

1 回答 1

4

更新

事实证明,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正常工作,问题出在其他地方(这些值不是AddressEditorsTypeEditors只是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
于 2014-09-04T20:44:20.093 回答