2

リスト TableColumns< T > を使用して Dart にテーブルを表示する基本クラス Table< T > を構築しようとしています。Java では、これは、リーフ クラスが次のように単純に見える匿名クラス パターンで行われます。

class PartTable extends Table< Part > {

  // Column 1: Part Number


  addColumn( new TableColumn<Part>("Part Number") {

    String get(Part part) { part.getNumber().toString() }

    void set(Part part, String number) {
      part.setNumber(number);
    }
  });

  // Column 2: Part Description

  addColumn( new TableColumn<Part>("Part Description") {

    String get(Part part) { part.getDescription().toString() }

    void set(Part part, String desc) {
      part.setDescription(desc);
    }
  });

}

上記の Java Anonymous Class パターンの代わりになる Dart デザイン パターンを提案できる人はいますか? 基本的な考え方は、匿名の TableColumn クラスの抽象メソッド (get や set など) が Table コンストラクターの匿名クラスによってオーバーライドされ、パーツの属性を操作するためのビュー固有のオーバーライドを提供することです。したがって、テーブルには任意の数の列を含めることができ、テーブル セルの各パーツ属性に対してビュー固有の CRUD 動作を提供できます。

4

1 に答える 1

2

あなたの質問に対する一般的な答えはないと思います。それは本当にあなたのコードに依存します。すべての匿名クラスのクラスを作成するか、API をリファクタリングして回避することができます。

たとえば、関数を使用してget/を定義するようにサンプル コードをリファクタリングできsetます。

final table = new Table<Part>()
    ..addColumn(new Column<Part>(
        "Part Number", 
        (p) => p.number.toString(),
        (p, s) => p.number = s))
    ..addColumn(new Column<Part>(
        "Part Description", 
        (p) => p.desc.toString(), 
        (p, s) => p.desc = s));

基になるコードは次のとおりです。

typedef String ColumnGetter<T>(T t);

typedef void ColumnSetter<T>(T t, String s);

class Column<T> {
  final String name;
  final ColumnGetter<T> get;
  final ColumnSetter<T> set;
  Column(this.name, this.get, this.set);
}

class Table<T> {
  List<T> _elements;
  final _columns = [];
  void addColumn(Column<T> column) => _columns.add(column);
  void set elements(List<T> elements) {
    this._elements = elements;
    // updateDisplay
  }
}
于 2013-09-04T09:15:04.063 に答える