2

我正在尝试构建一个基类 Table<T>,它使用列表 TableColumns<T> 在 Dart 中显示一个表格。在 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);
    }
  });

}

任何人都可以提出一个 Dart 设计模式来很好地替代上面的 Java 匿名类模式吗?基本思想是匿名 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 回答