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はい、どちらかが であることはわかっていますが、DartでまたはTextEditorを識別する方法はありますか。TypeEditorAddressEditor

検証の結果を処理するには、これらの識別を行う必要があります。

ありがとう

4

1 に答える 1

4

アップデート

新しいエディタ インスタンスを取得するために呼び出されるTextEditorメソッドがあることがわかります(基本的には、ファクトリと実装が 1 つになっています)。newInstance()BWU DatagridTextEditor

TypeEditorandAddressEditorはこのメソッドをオーバーライドしないため、内部的に純粋なTextEditorインスタンスが作成されます。

newInstance目的の動作を得るには、このメソッドで使用されるコンストラクターをオーバーライドして実装する必要があります。のコンストラクターTextEditorはプライベートであるため、再利用できず、コピーする必要があります (この設計は再検討します)。コピーしたコンストラクターの最初の 2 行を少し変更する必要があります。

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
于 2014-09-04T20:44:20.093 に答える